2013-10-11 18 views
0

我有一個數據庫,我將它導入到我的項目(android移動應用程序)它的工作原理,它從表中檢索數據,但是當我修改數據庫通過sqlite數據庫瀏覽器添加表或行,然後清理項目並導入新數據庫,然後從我的設備上卸載項目並再次運行它強制停止應用程序,並在日誌部分告訴我們沒有這樣的表。沒有這樣的表..當我在android eclipse中修改表

即使當我創建新的數據庫並將其導入到項目中時,它也不起作用。

10-11 13:55:03.152: E/SQLiteLog(10632): (1) no such table: facilities 
10-11 13:55:03.162: D/AndroidRuntime(10632): Shutting down VM 
10-11 13:55:03.162: W/dalvikvm(10632): threadid=1: thread exiting with uncaught exception (group=0x419b6700) 
10-11 13:55:03.182: E/AndroidRuntime(10632): FATAL EXCEPTION: main 
10-11 13:55:03.182: E/AndroidRuntime(10632): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.buttontest/com.example.buttontest.WhereToGo}: android.database.sqlite.SQLiteException: no such table: facilities (code 1): , while compiling: SELECT category as '_id' FROM facilities 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.ActivityThread.startActivityNow(ActivityThread.java:2054) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.widget.TabHost.setCurrentTab(TabHost.java:413) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:154) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.view.View.performClick(View.java:4240) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.view.View$PerformClick.run(View.java:17721) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.os.Handler.handleCallback(Handler.java:730) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.os.Looper.loop(Looper.java:137) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at java.lang.reflect.Method.invokeNative(Native Method) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at java.lang.reflect.Method.invoke(Method.java:525) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at dalvik.system.NativeStart.main(Native Method) 
10-11 13:55:03.182: E/AndroidRuntime(10632): Caused by: android.database.sqlite.SQLiteException: no such table: facilities (code 1): , while compiling: SELECT category as '_id' FROM facilities 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at com.example.buttontest.WhereToGo.listNotes(WhereToGo.java:34) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at com.example.buttontest.WhereToGo.onStart(WhereToGo.java:28) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.Activity.performStart(Activity.java:5143) 
10-11 13:55:03.182: E/AndroidRuntime(10632): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
10-11 13:55:03.182: E/AndroidRuntime(10632): ... 18 more 
10-11 13:55:04.832: I/Process(10632): Sending signal. PID: 10632 SIG: 9 

這裏是我的代碼:

DataBaseHelper.java

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window 
//destination path (location) of our database on device 
private static String DB_PATH = ""; 
private static String DB_NAME ="btm_";// Database name 
private SQLiteDatabase mDataBase; 
private final Context mContext; 

public DataBaseHelper(Context context) 
{ 
super(context, DB_NAME, null, 1);// 1? its Database Version 
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
this.mContext = context; 
}  

public void createDataBase() throws IOException 
{ 
//If database not exists copy it from the assets 

boolean mDataBaseExist = checkDataBase(); 
if(!mDataBaseExist) 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    if (db.isOpen()){ 
     db.close(); 
    } 
    this.close(); 
    try 
    { 
     //Copy the database from assests 
     copyDataBase(); 
     Log.e(TAG, "createDatabase database created"); 
    } 
    catch (IOException mIOException) 
    { 
     throw new Error("ErrorCopyingDataBase"); 
    } 
    } 
    } 
    //Check that the database exists here: /data/data/your package/databases/Da Name 
    private boolean checkDataBase() 
    { 
    File dbFile = new File(DB_PATH + DB_NAME); 
    //Log.v("dbFile", dbFile + " "+ dbFile.exists()); 
    return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException 
    { 
    InputStream mInput = mContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream mOutput = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
     mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException 
    { 
    String mPath = DB_PATH + DB_NAME; 
    //Log.v("mPath", mPath); 
    mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
    return mDataBase != null; 
    } 

    @Override 
    public synchronized void close() 
    { 
    if(mDataBase != null) 
     mDataBase.close(); 
     super.close(); 
    } 
    public Cursor getData() { 
     String myPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(myPath, null, 
     SQLiteDatabase.OPEN_READONLY); 
     Cursor c = mDataBase.rawQuery("SELECT * FROM category", null); 

     return c; 
    } 
    public Cursor getFacilityData() { 
     String myPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(myPath, null, 
     SQLiteDatabase.OPEN_READONLY); 
     Cursor c = mDataBase.rawQuery("SELECT _id,name FROM facilities", null); 

     return c; 
    } 
@Override 
public void onCreate(SQLiteDatabase arg0) { 
    // TODO Auto-generated method stub 

} 

And Here is new class with calling the database code: 
private void listNotes(){ 
    SQLiteDatabase db = db_con.getWritableDatabase(); 
    try { 
     Cursor c = db.rawQuery("SELECT category as '_id' " + 
       "FROM facilities ",null); 
     final ListAdapter noteAdapter = new 
SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, c,new String[] {"_id"},new int[] 
{android.R.id.text1}); 
     this.setListAdapter(noteAdapter); 
    } finally { 
    db.close(); 
    } 
    } 
+0

您卸載該應用程序之前,建議先清洗所有數據,然後卸載應用程序。同樣,如果您要添加新表格,則必須在代碼文件中包含相同的代碼以處理這些表格 –

回答

0

當您打開一個數據庫時,db.onCreate()被調用。所以,現在如果它找到一個具有匹配名稱的數據庫,它將不會調用更新表所需的方法。所以我通常要做的是,物理刪除數據庫或在助手上重命名數據庫。這樣當你嘗試打開數據庫時,db.onCreate()方法將不會找到數據庫並且會創建一個數據庫。

+0

哦並且更改版本號碼也可能有所幫助。 – Ndupza

1

DataBaseHelper.java

public class DataBaseHelper extends SQLiteOpenHelper { 
    private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window 
    //destination path (location) of our database on device 
    private static String DB_PATH = ""; 
    private static String DB_NAME ="btm_";// Database name 
    private SQLiteDatabase mDataBase; 
    private final Context mContext; 

    public DataBaseHelper(Context context) { 
     super(context, DB_NAME, null, 1);// 1? its Database Version 
     DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
     this.mContext = context; 
    }  

    public void createDataBase() throws IOException { 
     //If database not exists copy it from the assets 

     boolean mDataBaseExist = checkDataBase(); 
     if(!mDataBaseExist) { 
      SQLiteDatabase db = this.getReadableDatabase(); 
      if (db.isOpen()) { 
       db.close(); 
      } 
      this.close(); 
      try { 
       //Copy the database from assests 
       copyDataBase(); 
       Log.e(TAG, "createDatabase database created"); 
      } catch (IOException mIOException) { 
       throw new Error("ErrorCopyingDataBase"); 
      } 
     } 
    } 

    //Check that the database exists here: /data/data/your package/databases/Da Name 
    private boolean checkDataBase() { 
     File dbFile = new File(DB_PATH + DB_NAME); 
     //Log.v("dbFile", dbFile + " "+ dbFile.exists()); 
     return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException { 
     InputStream mInput = mContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream mOutput = new FileOutputStream(outFileName); 
     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer))>0) { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException { 
     String mPath = DB_PATH + DB_NAME; 
     //Log.v("mPath", mPath); 
     mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     return mDataBase != null; 
    } 

    @Override 
    public synchronized void close() { 
     if(mDataBase != null) 
      mDataBase.close(); 
     super.close(); 
    } 

    public Cursor getData() { 
     String myPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READONLY); 
     Cursor c = mDataBase.rawQuery("SELECT * FROM category", null); 

     return c; 
    } 

    public Cursor getFacilityData() { 
     String myPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READONLY); 
     Cursor c = mDataBase.rawQuery("SELECT _id,name FROM facilities", null); 

     return c; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase arg0) { 
     // TODO Auto-generated method stub 
    } 
} 

,這裏是新類調用數據庫的代碼:

private void listNotes() { 
    SQLiteDatabase db = db_con.getWritableDatabase(); 
    try { 
     Cursor c = db.rawQuery("SELECT category as '_id' " + 
       "FROM facilities ",null); 
     final ListAdapter noteAdapter = new 
SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, c,new String[] {"_id"},new int[] 
{android.R.id.text1}); 
     this.setListAdapter(noteAdapter); 
    } finally { 
     db.close(); 
    } 
} 
+2

我已將此代碼編輯到問題中。這個答案應該被刪除。 –