android Provider初始数据

时间:2011-02-16 04:38:39

标签: android provider

所有。    我想在db(sqlite)创建时插入一些初始数据。

如果没有插入操作,程序工作正常。但是当我添加它时,它会导致错误。我无法理解。它似乎是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不这样做,并且需要自己去做。

3 个答案:

答案 0 :(得分:1)

对于执行插入查询,您应该以可写模式打开数据。

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

答案 1 :(得分:1)

您正在以可读模式打开数据库,这就是为什么会抛出此异常。

尝试在可写模式下打开数据库,如下所示:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

答案 2 :(得分:0)

请确保:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

不在你的主线程中