Java 无法从另一个类将记录插入SQLite数据库
我试图将记录插入sqlite数据库并绕过contentResolver。第一个名为EventProvider的类扩展了ContentProvider,还包含我的SQLite数据库助手类的一个实例,如下所示。因此,当我通过contentResolver插入记录时,第一个类中的代码工作正常,但在EventJSONParser类中,我希望直接将记录插入sqlite,而不是通过SQLiteDatabase db=provider.getDatabase中的NullPointerException插入;unmarshalEventQuery方法中的代码行。我怀疑databasehelper的实例不是由onCreate方法创建的。请告诉我如何解决这个问题。谢谢 头等舱:Java 无法从另一个类将记录插入SQLite数据库,java,android,mysql,database,sqlite,Java,Android,Mysql,Database,Sqlite,我试图将记录插入sqlite数据库并绕过contentResolver。第一个名为EventProvider的类扩展了ContentProvider,还包含我的SQLite数据库助手类的一个实例,如下所示。因此,当我通过contentResolver插入记录时,第一个类中的代码工作正常,但在EventJSONParser类中,我希望直接将记录插入sqlite,而不是通过SQLiteDatabase db=provider.getDatabase中的NullPointerException插入;u
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();
}
}
}在对数据库运行操作之前,应先打开数据库。 这个类文件 请参阅我的github: 为了更好地在宣言文件中授予权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在何处使用EventJSONParser类请添加带问题的代码谢谢您的回答…但是由于我的数据库连接是在onCreate方法中打开的…我如何重用它来连接数据库。请在另一个方法中打开和关闭数据库连接。在每次数据库操作之后,使用close方法关闭数据库连接。并在每次DB操作之前调用open方法。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />