dbHelper.getWritableDatabase() не работает

У меня есть пользовательский 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 никогда не запускался.

Я предполагаю, что проблема в том, что помощник создается, но никогда не создается, что может быть не так?

Примечание. Я пробовал тот же процесс без поставщика контента, помощника внутри моей активности, и все работало нормально. Но это не так, когда я делаю это внутри поставщика контента...?

Что может быть не так???


person Martin Osorio    schedule 28.09.2012    source источник
comment
Изучите LogCat и просмотрите трассировку стека Java, связанную с принудительным закрытием.   -  person CommonsWare    schedule 29.09.2012
comment
SQL_CREATE_MAIN = CREATE TABLE Users ( + _ID INTEGER PRIMARY KEY AUTOINCREMENT, + имя ТЕКСТ, + фамилия ТЕКСТ, + номер телефона ТЕКСТ, + адрес электронной почты ТЕКСТ, + имя пользователя ТЕКСТ, + пароль ТЕКСТ, + пол ТЕКСТ, + страна ТЕКСТ);;   -  person Martin Osorio    schedule 29.09.2012


Ответы (1)


вы не создаете экземпляр базы данных внутри метода вставки 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;
person user1137313    schedule 15.11.2014