2013-04-24 3 views
0

Ниже в LogCat вы можете увидеть, что моя таблица базы данных никогда не обновляется, даже dow я увеличиваю версию базы данных. Я добавил таблицу в свой db, импортировал ее в папку с ресурсами. В моем методе 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

+0

Считаете ли вы предварительное заполнение его использованием операторов sql? У вас может быть файл, содержащий такие операторы в папке с ресурсами. – rubenlop

+0

Почему? У меня будет 5000 строк. Так проще. Основная проблема здесь в том, что мой метод onUpgrade никогда не вызывается. Я разместил в нем строку Log.e, и я не вижу его нигде в LogCat, поэтому он никогда не исполнялся. – marjanbaz

Смежные вопросы