gpt4 book ai didi

android - SQLiteAssetHelper NullPointerException 仅在某些设备上

转载 作者:IT王子 更新时间:2023-10-29 06:22:59 25 4
gpt4 key购买 nike

我正在使用 SQLiteAssetHelper 库来处理我的应用程序数据库操作,它几乎适用于我测试过的每部手机。然而,一些使用 Android 2.3.3 - 2.3.7 的用户报告在调用打开数据库时崩溃。我怀疑这是由于第一次从 Assets 文件夹复制数据库时出现的一些问题(例如内部存储空间不足)。

辅助类:

public class DbHelper extends SQLiteAssetHelper {

final static String DB_NAME="db";
static final int DB_VERSION = 1307181213;
final Context context;

public DbHelper(Context c) {
super(c, DB_NAME, null, DB_VERSION);
this.context = c;
setForcedUpgradeVersion(DB_VERSION);
}
}

处理程序类(如果无法打开数据库,我会设置一个计数器在 10 秒后超时):

public class DbHandlerDao {

private SQLiteDatabase database;
private DbHelper dbHelper;

public DbHandlerDao(Context context) {
dbHelper = new DbHelper(context);
}

public void open() throws SQLException {
boolean opened = false;
int timeout = 0;
while (!opened && timeout < 10000) {
try {
database = dbHelper.getReadableDatabase();
opened = true;
}
catch (IllegalStateException e) {
timeout += 500;
try {
Thread.sleep(500);
} catch (Exception e2) {

}
}
}
}

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

调用类:

private class DbAsyncTask extends AsyncTask<Long, Void, Void> {

//...

@Override
protected Void doInBackground(Long... params) {
dataHandler.open();

异常(exception):

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:180)
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
at com.example.DbHandlerDao.open(DbHandlerDao.java:25)
at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:244)
at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

最佳答案

可能是用户清空了他们的存储空间或者他们没有 SD 卡?

可能是偶尔发生的崩溃。

** 你实现了oncreate和onupgrade方法了吗?

我使用 open 助手。所以我从来没有打开数据库的麻烦。

 public class RidesDatabaseHandler extends SQLiteOpenHelper {

...

    // Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_RIDES + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_DESCRIPTION + " TEXT," + KEY_BOUNDS_NELAT + " TEXT,"
+ KEY_BOUNDS_NELONG + " TEXT," + KEY_BOUNDS_SWLAT + " TEXT,"
+ KEY_BOUNDS_SWLONG + " TEXT," + KEY_RESRAWID + " TEXT,"
+ KEY_RESDRAWABLEID + " TEXT," + KEY_PATH + " TEXT,"
+ " CONSTRAINT UNQ_" + KEY_PATH + " UNIQUE (" + KEY_PATH
+ ") ON CONFLICT ABORT)";

// VERSION 43 ADDS THE KEY_DATE_UPDATE COLUMN
CREATE_CONTACTS_TABLE += " , " + KEY_DATE_UPDATE + " INTEGER DEFAULT 0";

db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

int upgradeTo = oldVersion + 1;
while (upgradeTo <= newVersion) {
switch (upgradeTo) {
// update old resrawid's to constants
// this was caused when I saved R values in the database
// and then later realized they would change.
// the old resrawid is changed to a constant.
case 42:
ContentValues values;
@SuppressWarnings("unused")
// used for debugging so I can see the value of the update.
int res;
int rs;
rs = 2130968576;
values = new ContentValues();
values.put(
KEY_RESRAWID,
com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_DRAGON);
res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
new String[] { String.valueOf(rs) });

rs = 2130968577;
values = new ContentValues();
values.put(
KEY_RESRAWID,
com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_M119);
res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
new String[] { String.valueOf(rs) });

rs = 2130968578;
values = new ContentValues();
values.put(
KEY_RESRAWID,
com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_MEDINA);
res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
new String[] { String.valueOf(rs) });
break;
case 43:
// new column added for last_viewed.
db.execSQL(VERSION_43_ALTER);
break;

case 44:
// new index on KEY_DATE_UPDATE DESC
db.execSQL(VERSION_44_CREATE_INDEX);
}
upgradeTo++;
}

祝你好运

关于android - SQLiteAssetHelper NullPointerException 仅在某些设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com