【问题标题】:Unable to insert record into SQLite database from another class无法从另一个类将记录插入 SQLite 数据库
【发布时间】:2015-02-15 13:11:45
【问题描述】:

我正在尝试将记录插入 sqlite 数据库并绕过 contentResolver。第一个名为 EventProvider 的类扩展了 ContentProvider,还包含我的 SQLite 数据库助手类的实例,如下所示。因此,当我通过 contentResolver 插入记录时,第一类中的代码工作正常,但在 EventJSONParser 类中我想直接将记录插入 sqlite,而不是通过 SQLiteDatabase db = provider.getDatabase(); 中的 NullPointerException 插入记录。 unmarshalEventQuery 方法中的代码行。我怀疑数据库助手的实例不是由 onCreate() 方法创建的。请我需要有关如何解决此问题的建议。谢谢。

头等舱:

public class EventProvider extends ContentProvider{
private DatabaseHelper helper;
private SQLiteDatabase db;

@Override
public boolean onCreate() {
    helper = new DatabaseHelper(getContext());
    db = helper.getWritableDatabase();
    return true;
}

public SQLiteDatabase getDatabase(){
    return db;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    if (BuildConfig.DEBUG) { Log.d(TAG, "insert@" + uri); }

    switch (uriMatcher.match(uri)){
        case EVENTS_DIR:
            break;
        default:
            throw new UnsupportedOperationException("Unrecognized URI: " + uri);
    }

    values = COLUMN_MAP.translateCols(values);
    values.put(DatabaseContract.COL_DIRTY, MARK);enter code here

    SQLiteDatabase db = getDatabase();
    return eventInsert(uri, values, db);
}

public Uri eventInsert(Uri uri, ContentValues values, SQLiteDatabase mdb){
    if (BuildConfig.DEBUG){
        Log.d(TAG, "insert@" + uri + ": {" + values + "}");
    }

    long pk = mdb.insert(DatabaseContract.EVENT_TABLE, null, values);

    if (pk > 0) {
        uri = null;
    } else{
        uri = uri.buildUpon().appendPath(String.valueOf(pk)).build();
        getContext().getContentResolver().notifyChange(uri, null);
    }
    return uri;
}

二等:

public class EventJSONParser {

private EventProvider provider;

public EventJSONParser(EventProvider restfulProvider){
    provider = restfulProvider;
}

public void unmarshalEventQuery(JSONObject json){
    try {
        String error = json.getString(Const.KEY_ERROR);
        int statusCode = json.getInt(Const.KEY_STATUS_CODE);

        if (error.equals("false") && statusCode == 200){
            JSONArray events = json.getJSONArray(TAG_EVENTS);

            for(int i = 0; i < events.length(); i++){
                JSONObject e = events.getJSONObject(i);
                ContentValues values = new ContentValues();

                values.put(UNMARSHAL_TAB.get(TAG_EVENT_ID), e.getString(TAG_EVENT_ID));
                values.put(UNMARSHAL_TAB.get(TAG_CAL_ID), e.getString(TAG_CAL_ID));
                values.put(UNMARSHAL_TAB.get(TAG_EVENT_TITLE), e.getString(TAG_EVENT_TITLE));
                values.put(UNMARSHAL_TAB.get(TAG_START_DATE), e.getString(TAG_START_DATE));
                values.put(UNMARSHAL_TAB.get(TAG_END_DATE), e.getString(TAG_END_DATE));
                values.put(UNMARSHAL_TAB.get(TAG_LOCATION), e.getString(TAG_LOCATION));
                values.put(UNMARSHAL_TAB.get(TAG_VISIBILITY), e.getString(TAG_VISIBILITY));
                values.put(UNMARSHAL_TAB.get(TAG_DESCRIPTION), e.getString(TAG_DESCRIPTION));

                SQLiteDatabase db = provider.getDatabase();
                Uri uri = provider.eventInsert(EventContract.EVENT_URI, values, db);
                Log.e(TAG, "query uri" + uri);
            }
        }
    }catch (JSONException ex){
        ex.printStackTrace();
    }
}

}

【问题讨论】:

  • 在哪里使用EventJSONParser 类请添加问题代码

标签: java android mysql database sqlite


【解决方案1】:

您应该在对数据库运行操作之前打开数据库。 这个类文件link

public CourseGateWay(Context context) {
        dbOpenHelper = new DBOpenHelper(context);
        this.context = context;
    }

    public void open() {
        try {
            sqLiteDB = dbOpenHelper.getWritableDatabase();
        } catch (SQLException s) {
            new Exception("Error with DB Open");
        }
    }

    public void close() {
        sqLiteDB.close();
    }

    public String saveCourse(Courses aCore) {
        ContentValues contentValues = new ContentValues();

        open();

        contentValues.put(DBOpenHelper.COURS_CODE, aCore.getcCode());
        contentValues.put(DBOpenHelper.COURS_NAME, aCore.getcName());
        contentValues.put(DBOpenHelper.COURS_DEPT, aCore.getdCode());

        long res = sqLiteDB.insert(DBOpenHelper.TABLE_COURS, null,
                contentValues);
        close();

        if (res > 0) {
            return "Course Added with: " + aCore.getcCode();
        } else {
            return "Duplicate Entry with: " + aCore.getcName();
        }

    }

请看我的github:here

为了更好地在 Manifesto 文件中授予权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 感谢您的回答......但是由于我的数据库连接是在 onCreate() 方法中打开的......我如何重用它来连接数据库。
  • 用另一种方法打开和关闭你的数据库连接。在每个数据库操作之后,使用调用 close() 方法关闭您的数据库连接。并在每个数据库操作之前调用您的 open() 方法。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多