2016-03-03 1 views
0

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); 

Répondre

0

Ce genre d'exception est généralement lorsque vous créez plus d'une fois instance de la classe de base de données et plus d'une instance tente d'accéder à la base de données même time.Try En utilisant Singleton approche, il va certainement résoudre votre problème. Dites-le moi si vous avez besoin d'aide. codage heureux :) Cochez cette case si cela vous aide.

+0

J'ai utilisé une approche SIngleton comme indiqué dans mon code ci-dessus :( –