Я использую com.j256.ormlite: ormlite-android: 4.48 на Android.Android SQLiteDatabaseLockedException с ormlite
Я использую OrmLiteSqliteOpenHelper с одноэлементным шаблоном (всего один экземпляр для всего приложения).
Я написал тестовое приложение (используя несколько AsyncTask с операциями чтения/создания/обновления ), и он отлично работает, даже проверяет его в режиме деблокирования.
Он отлично работает на фактическом производстве/выпуске на моем телефоне (Samsung S3 и Mi4i), но иногда я получаю отчет об ошибке с SQLiteDatabaseLockedException от других пользователей.
Интересно, я сделал что-то не так, или SQLite имеют разные непредсказуемые поведения на разных телефонах Android?
Ниже приведены некоторые из моего кода:
public class DbHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "test.db";
private static final int DATABASE_VERSION = 1;
private Dao<ModelA, String> modelADao = null;
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);
// this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, ModelA.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
public Dao<ModelA, String> getModelADao() throws SQLException {
if (modelADao == null) {
modelADao = getDao(ModelA.class);
}
return modelADao;
}
}
@DatabaseTable(tableName = "model_a")
public class ModelA {
@DatabaseField(id = true, columnName = "_id")
public String id;
@DatabaseField(columnName = "created")
public Date created;
@DatabaseField(columnName = "name")
public String name;
@DatabaseField(columnName = "age")
public int age;
@DatabaseField(columnName = "is_active")
public boolean isActive;
}
public class App {
public static final String TAG = App.class.getName();
private static DbHelper dbHelper;
public synchronized static DbHelper buildDbHelper(Context context) {
if (dbHelper == null) {
Log.d(TAG, "buildDbHelper");
dbHelper = OpenHelperManager.getHelper(context, DbHelper.class);
}
return dbHelper;
}
public static DbHelper getDbHelper() {
if (dbHelper == null) {
Log.e(TAG, "getDbHelper=null");
}
return dbHelper;
}
}
# Read
List<ModelA> items = App.getDbHelper().getModelADao().queryForAll();
# Create
Dao<ModelA, String> dao = App.getDbHelper().getModelADao();
ModelA item = new ModelA();
item.id = UUID.randomUUID().toString();
item.name = item.id;
item.created = Calendar.getInstance().getTime();
item.age = rand.nextInt(100);
dao.create(item);
Я использовал подход SIngleton, как показано в моем коде выше :( –