0

カスタム メンバー SQLiteDatabaseHelper を持つカスタム ContentProvider があります。データベースに挿入しようとしているときに、挿入内で 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 が null でないことはわかっています。dbHelper コンストラクターが実行されたことはわかっています。しかし、dbHelper onCreate は一度も実行されていません。

私の推測では、問題はヘルパーがインスタンス化されているが作成されていないことです。何が間違っているのでしょうか?

注: アクティビティ内のヘルパーであるコンテンツ プロバイダーを使用せずに同じプロセスを試したところ、すべて正常に機能しました。しかし、コンテンツ プロバイダー内で行うと、そうではありません...?

何が間違っている可能性がありますか???

4

1 に答える 1

0

Uri 挿入メソッド内でデータベースをインスタンス化しません。挿入は次のようになります。

 @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 に答える