0

我有一个自定义 ContentProvider,带有一个自定义成员 SQLiteDatabaseHelper 在尝试插入我的数据库时,在我的插入中,我实例化了我的 DatabaseHelper,然后我尝试在该实例上调用 getWritableDatabase() 以获取一个 SQLiteDatabase 对象,但我得到了一个强制关闭 getWritableDatabase() 调用。

我的活动:

public class UserForm extends Activity {
    public void onSubmitClick(View v){
        userDatabase db = new userDatabase();
        db.insert(userDatabase.CONTENT_URI, null);
    ...}
...}

我的助手代码:

public static final class MainDatabaseHelper extends SQLiteOpenHelper{
    public MainDatabaseHelper(Context context) {            
        super(context, DBNAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_MAIN);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS Users");
    }
}

我的插入:

public class userDatabase extends ContentProvider {
     public Uri insert(Uri uri, ContentValues values) {
              MainDatabaseHelper dbHelper = new MainDatabaseHelper(getContext());
              SQLiteDatabase db = dbHelper.getWritableDatabase();
    ...}
...}

我在最后一行得到了一个力量。

我知道 dbHelper 不为空。我知道 dbHelper 构造函数运行了。但是 dbHelper onCreate 从未运行过。

我的猜测是问题是助手被实例化但从未创建,可能有什么问题?

注意:我在没有内容提供者的情况下尝试了相同的过程,我的活动中没有助手,一切正常。然而,当我在内容提供者内部这样做时它不会......?

可能有什么问题???

4

1 回答 1

0

您不会在 Uri insert 方法中实例化数据库。插入应该如下所示:

 @Override
    public Uri insert(Uri uri, ContentValues values) {
        String tabela = "";
        Uri contentu;
        long rowID;
        switch (uriMatcher.match(uri)) {
            case uriCode2:
                tabela = TABLE_CLIENTI;
                contentu = CONTENT_URI_CLIENTI;
                break;
            case uriCode4:
                tabela = TABLE_UZERI;
                contentu = CONTENT_URI_UZERI;
                break;
            default:
                tabela = "";
                contentu = uri;
                throw new IllegalArgumentException("Unsupported URI: " + uri);
        }

        rowID = db.insert(tabela, "", values);
        if (rowID > 0) {
            Log.e(TAGU,"Notify change...");
            Uri _uri = ContentUris.withAppendedId(contentu, rowID);
            getContext().getContentResolver().notifyChange(_uri, null);
            return _uri;
        }
        throw new SQLException("Failed to add a record into " + uri);
    }

其中 db 在 contentProvider 类声明之后立即声明,例如:

private SQLiteDatabase db;
于 2014-11-15T19:03:11.933 回答