J'utilise com.j256.ormlite: ormlite-android: 4.48 sur Android. J'utilise OrmLiteSqliteOpenHelper avec un motif singleton (une seule instance pour l'application entière).Android SQLiteDatabaseLockedException avec ormlite
J'ai écrit une application de test (en utilisant plusieurs AsyncTask avec des opérations de lecture/création/mise à jour ) et cela fonctionne bien, même tester en mode Release.
Cela fonctionne très bien sur la production/version réelle fonctionnant sur mon téléphone (Samsung S3 et Mi4i), mais parfois je reçois un rapport de bogue avec SQLiteDatabaseLockedException d'autres utilisateurs.
Je me demande si j'ai fait quelque chose de mal, ou si SQLite a un comportement différent et imprévisible sur un autre téléphone Android?
Voici quelques-uns de mon code:
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);
J'ai utilisé une approche SIngleton comme indiqué dans mon code ci-dessus :( –