2013-04-24 68 views
0

在LogCat中,您可以看到我的数据库表永远不会更新,甚至不会更新数据库版本。我添加了一个表到我的数据库,一个导入到资产文件夹。在我的onUpgrade方法中,我删除旧版本的db并复制新版本。至少我是在我的代码中完成的。我认为这种方法从未被调用过。我每次都没有这样的表错误。我的数据库永远不会得到更新

04-24 02:08:27.502: D/szipinf(6630): Initializing inflate state 
04-24 02:08:27.612: D/szipinf(6630): Initializing inflate state 
04-24 02:08:27.612: D/szipinf(6630): Initializing zlib to inflate 
04-24 02:08:30.972: I/Database(6630): sqlite returned: error code = 1, msg = no such table: tbl4 
04-24 02:08:30.972: E/DataAdapter(6630): getTestData >>android.database.sqlite.SQLiteException: no such table: tbl4: , while compiling: SELECT * FROM tbl4 ORDER BY _ID ASC 
04-24 02:08:30.982: D/AndroidRuntime(6630): Shutting down VM 
04-24 02:08:30.982: W/dalvikvm(6630): threadid=1: thread exiting with uncaught exception (group=0x40018560) 
04-24 02:08:31.202: E/AndroidRuntime(6630): FATAL EXCEPTION: main 
04-24 02:08:31.202: E/AndroidRuntime(6630): java.lang.RuntimeException: Unable to start activity ComponentInfo{rs.androidaplikacije.themostcompleteiqtest/rs.androidaplikacije.themostcompleteiqtest.LogicTest}: android.database.sqlite.SQLiteException: no such table: tbl4: , while compiling: SELECT * FROM tbl4 ORDER BY _ID ASC 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.os.Looper.loop(Looper.java:130) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at dalvik.system.NativeStart.main(Native Method) 
04-24 02:08:31.202: E/AndroidRuntime(6630): Caused by: android.database.sqlite.SQLiteException: no such table: tbl4: , while compiling: SELECT * FROM tbl4 ORDER BY _ID ASC 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at rs.androidaplikacije.themostcompleteiqtest.TestAdapter.getTestDataLogic(TestAdapter.java:103) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at rs.androidaplikacije.themostcompleteiqtest.LogicTest.nextQuestion(LogicTest.java:136) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at rs.androidaplikacije.themostcompleteiqtest.LogicTest.onCreate(LogicTest.java:93) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
04-24 02:08:31.202: E/AndroidRuntime(6630):  ... 11 more 
04-24 02:08:32.912: I/Process(6630): Sending signal. PID: 6630 SIG: 9 

数据库帮手:

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 = "/data/data/rs.androidaplikacije.themostcompleteiqtest/databases/"; 
private static String DB_NAME ="pitanja.sqlite";// Database name 
private static SQLiteDatabase mDataBase; 
private final Context mContext; 
private static final int DATABASE_VERSION = 25; 

public DataBaseHelper(Context mojContext) 
{ 
    super(mojContext, DB_NAME, null, DATABASE_VERSION);// 1 it's Database Version 
    DB_PATH = mojContext.getApplicationInfo().dataDir + "/databases/"; 
    this.mContext = mojContext; 
} 

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


     this.getReadableDatabase(); 
     this.close(); 
     try 
     { 
      //Copy the database from assests 
      copyDataBase(); 
      Log.e(TAG, "createDatabase database created"); 
     } 
     catch (IOException mIOException) 
     { 
      throw new Error("ErrorCopyingDataBase"); 
     } 
    } 

/** 
* 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 
*/ 
public 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; 
} 
    /*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); 
     //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
     return mDataBase != null; 
    } 
    @Override 
    public void close() 
    { 
     if(mDataBase != null) 
      mDataBase.close(); 
     super.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase arg0) { 
     } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     mContext.deleteDatabase(DB_NAME); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
    } 

适配器:

public class TestAdapter 
{ 
    protected static final String TAG = "DataAdapter"; 

    private final Context mContext; 
    private SQLiteDatabase mDb; 
    private DataBaseHelper mDbHelper; 

    public TestAdapter(Context context) 
    { 
     this.mContext = context; 
     mDbHelper = new DataBaseHelper(mContext); 
    } 

    public TestAdapter createDatabase() throws SQLException 
    { 
     try 
     { 
      mDbHelper.createDataBase(); 
     } 
     catch (IOException mIOException) 
     { 
      Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase"); 
      throw new Error("UnableToCreateDatabase"); 
     } 
     return this; 
    } 

    public TestAdapter open() throws SQLException 
    { 
     try 
     { 
      mDbHelper.openDataBase(); 
      mDbHelper.close(); 
      mDb = mDbHelper.getReadableDatabase(); 
     } 
     catch (SQLException mSQLException) 
     { 
      Log.e(TAG, "open >>"+ mSQLException.toString()); 
      throw mSQLException; 
     } 
     return this; 
    } 

    public void close() 
    { 
     mDbHelper.close(); 
    } 

    public Cursor getTestDataMDPI(String whereClause) 
    {; 
     try 
     { 
      String sql ="SELECT * FROM tblPitanjaDanskaMDPI WHERE 1 = 1 " + whereClause + " ORDER BY _ID ASC"; 

      Cursor mCur = mDb.rawQuery(sql, null); 
      if (mCur!=null) 
      { 
       mCur.moveToNext(); 
      } 
      return mCur; 
     } 
     catch (SQLException mSQLException) 
     { 
      Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
      throw mSQLException; 
     } 
    } 
    public Cursor getTestDataHDPI(String whereClause) 
    {; 
     try 
     { 
      String sql ="SELECT * FROM tblPitanjaDanskaHDPI WHERE 1 = 1 " + whereClause + " ORDER BY _ID ASC"; 

      Cursor mCur = mDb.rawQuery(sql, null); 
      if (mCur!=null) 
      { 
       mCur.moveToNext(); 
      } 
      return mCur; 
     } 
     catch (SQLException mSQLException) 
     { 
      Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
      throw mSQLException; 
     } 
    } 
    public Cursor getTestDataLogic(String whereClause) 
    {; 
     try 
     { 
      String sql ="SELECT * FROM tbl4 " + whereClause + " ORDER BY _ID ASC"; 

      Cursor mCur = mDb.rawQuery(sql, null); 
      if (mCur!=null) 
      { 
       mCur.moveToNext(); 
      } 
      return mCur; 
     } 
     catch (SQLException mSQLException) 
     { 
      Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
      throw mSQLException; 
     } 
    } 
} 

在这里,只为你们看到该表存在(这是一个工作表,只是为了试试这个onUpgrade方法):

enter image description here

回答

0

啊,你的用法实际上是完全错误的:你不能删除数据库文件,并期望任何数据库句柄仍然有效。一旦删除文件,SQLiteDatabase db实例就不再有效:我很惊讶你甚至没有崩溃。

如果您想要使用onUpgrade您想要做的事情是要么做,要么做,而要做一些严重扭曲操作(删除文件并复制新文件)一对DROP TABLE/CREATE TABLE调用或ALTER TABLE调用来应用您的更改。

+0

那么,你能告诉我的ALTER表的例子吗?请记住,这是导入预填充的sqlite数据库。 – marjanbaz 2013-04-24 00:30:06

+0

你有没有考虑过使用sql语句预填充它?您可以在assets文件夹中包含一个包含这些语句的文件。 – rubenlop 2013-04-24 02:28:08

+0

为什么?我将有5000行。这样更容易。这里的主要问题是我的onUpgrade方法从不被调用。我在Log.e中放置了Log.e行,并且在LogCat中没有看到它,因此它从未执行过。 – marjanbaz 2013-04-24 11:45:16