2011-02-16 44 views
0

全部。 我想在創建時在db(sqlite)中插入一些初始數據。android提供商初始數據

如果沒有插入操作,該程序正常工作。但是當我添加它時,它會導致錯誤。我無法理解。它似乎是android獲得一個可讀取的db-handle來編寫它?我不確定。或者,也許android不允許在DatabaseHelper的onCreate()方法中插入數據?希望有人能解決我的問題。

02-16 12:34:20.445: ERROR/AndroidRuntime(24947): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 3: /data/data/com.kbonez.prodo/databases/prodo.db 

02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:170) 
**02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at com.kbonez.prodo.ProdoProvider.query(ProdoProvider.java:164)** 
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at android.content.ContentProvider$Transport.query(ContentProvider.java:130) 
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at android.content.ContentResolver.query(ContentResolver.java:202) 
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at android.app.Activity.managedQuery(Activity.java:1495) 
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):  at com.kbonez.prodo.ProdoList.onCreate(ProdoList.java:129) 

我看行164,這是

SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 

我只是添加這些代碼在我Provider.DatabaseHelper.onCreate()

final String insTemplate="insert into %s (%s,%s) values (%s);";    

     for(String i: ct.getResources().getStringArray(R.array.helpInit)){ 
      db.execSQL(String.format(insTemplate,PRODO_TABLE_NAME,Structer.TITLE,Structer.NOTE,i)); 
     } 

======= ================================================== = 解決了!

謝謝所有人,我試過了。我使用這個

// Get the database and run the query 
    try{ 
    SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 
    Cursor c = qb.query(db, projection, selection, selectionArgs, null, 
      null, orderBy); 

    // Tell the cursor what uri to watch, so it knows when its source data 
    // changes 
    c.setNotificationUri(getContext().getContentResolver(), uri); 
    return c; 
    }catch(SQLException e){ 
     SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

     return null; 
    } 

但我不明白,爲什麼android不這樣做,需要我們自己去做。

回答

1

對於執行插入查詢,您應該以可寫模式打開數據。

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 
+0

我仍然有問題。行164在query()方法中。你的意思是,如果我想插入這些初始數據。我應該嘗試獲取可寫的數據庫句柄,即使在查詢方法中? – 9nix00 2011-02-16 05:40:49

1

你在讀模式下打開數據庫,這就是爲什麼這是拋出此異常。在可寫模式

,請嘗試打開數據庫是這樣的:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

0

確保此:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

是不是在你的主線程