我有一个自定义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不是null。 我知道dbHelper构造函数已经运行了。 但是dbHelper onCreate从未运行过。
我的猜测是问题是帮助程序是实例化但从未创建过,可能是错误的?
注意:我尝试了没有内容提供程序的相同进程,我的活动中有一个帮助程序,一切正常。但是,当我在内容提供商内部这样做时,它不会...?
可能有什么问题???
答案 0 :(得分: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;