当前位置: 动力学知识库 > 问答 > 编程问答 >

sql - query doesn't work database android

问题描述:

I'm developing a simple Android application with SQL. I followed the following guides - Using your own SQLite database in Android applications

I get an error when trying to do a query the database.

Here is my DataBaseHelp.Java Class :

package namae.nombebe;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.content.Context;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteException;

import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper{

//The Android's default system path of your application database.

private static String DB_PATH = "/data/data/namae.nombebe/databases/";

private static String DB_NAME = "myDBName";

private SQLiteDatabase myDataBase;

private final Context myContext;

/**

* Constructor

* Takes and keeps a reference of the passed context in order to access to the application assets and resources.

* @param context

*/

public DataBaseHelper(Context context) {

super(context, DB_NAME, null, 1);

this.myContext = context;

}

/**

* Creates a empty database on the system and rewrites it with your own database.

* */

public void createDataBase() throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){

//do nothing - database already exist

}else{

//By calling this method and empty database will be created into the default system path

//of your application so we are gonna be able to overwrite that database with our database.

this.getReadableDatabase();

try {

copyDataBase();

} catch (IOException e) {

throw new Error("Error copying database");

}

}

}

/**

* Check if the database already exist to avoid re-copying the file each time you open the application.

* @return true if it exists, false if it doesn't

*/

private boolean checkDataBase(){

SQLiteDatabase checkDB = null;

try{

String myPath = DB_PATH + DB_NAME;

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){

//database does't exist yet.

}

if(checkDB != null){

checkDB.close();

}

return checkDB != null ? true : false;

}

/**

* Copies your database from your local assets-folder to the just created empty database in the

* system folder, from where it can be accessed and handled.

* This is done by transfering bytestream.

* */

private void copyDataBase() throws IOException{

//Open your local db as the input stream

InputStream myInput = myContext.getAssets().open(DB_NAME);

// Path to the just created empty db

String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream

OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile

byte[] buffer = new byte[1024];

int length;

while ((length = myInput.read(buffer))>0){

myOutput.write(buffer, 0, length);

}

//Close the streams

myOutput.flush();

myOutput.close();

myInput.close();

}

public void openDataBase() throws SQLException{

//Open the database

String myPath = DB_PATH + DB_NAME;

myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override

public synchronized void close() {

if(myDataBase != null)

myDataBase.close();

super.close();

}

@Override

public void onCreate(SQLiteDatabase db) {

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

// Add your public helper methods to access and get content from the database.

// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy

// to you to create adapters for your views.

}

And this is the way i open my database :

 public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

DataBaseHelper myDbHelper = new DataBaseHelper(this);

try

{

myDbHelper.createDataBase();

}

catch (IOException ioe)

{

throw new Error("Unable to create database");

}

try

{

myDbHelper.openDataBase();

}

catch(SQLException sqle)

{

throw sqle;

}

myDataBase = myDbHelper.getWritableDatabase();

Cursor c = myDataBase.rawQuery("SELECT * FROM Astuces", null);

// problem on this query

}

So the query doesn't work. (if i don't put it application work)

I have a Table Astuces.

Errors :

07-30 10:56:53.869: E/AndroidRuntime(503): java.lang.RuntimeException: Unable to start activity ComponentInfo{namae.nombebe/namae.nombebe.NomBebeActivity}: android.database.sqlite.SQLiteException: no such table: Astuces: , while compiling: SELECT * FROM Astuces

We can see I say there are no table Astuces I really have it so I didn't understand why i can find it.

网友答案:

I followed the same link, couple of weeks ago. There are some important things that you must consider before you start to use the codes:

1 - you need to add a table to your SQLite file calls android_metadata and then insert en_US to it.

2 - you must rename the id to _id.

3 - you should copy your SQLite file to the assets folder of your project.

Then you can use the codes. How you done these 3 steps?

Where is myDataBase class? Where did you implement these methods in your code?

myDataBase = myDbHelper.getWritableDatabase();
Cursor c = myDataBase.rawQuery("SELECT * FROM Astuces", null);

You may need to have something like this in your DataBaseHelper class

public Cursor fetchAllEntries() {
            //includes all column names
        String[] projection = new String[] { KEY_ROWID, USER_ID, START, END };
        String restrict = null; // Get all entries
            String orderby = null;
        return myDataBase.query(TABLE_NAME, projection, restrict, null, null, null, orderby);
    }

and call it like this in the main activity:

Cursor entryCursor = db.fetchAllEntries();
分享给朋友:
您可能感兴趣的文章:
随机阅读: