R
Raidri
Ambitioniertes Mitglied
- 1
Hallo,
ich bekomme über ORMLite folgenden Fehler:
"Caused by: android.database.sqlite.SQLiteException: cannot commit - no transaction is active"
Komischerweise tritt dieser Fehler nur beim ersten mal App installieren auf. Wenn die Datenbank angelegt wurde und die Tabellen hinzugefügt wurden. Möchte ich nun ein Object in die Datenbank adden bekomme ich genau diesen Fehler. Beende ich die App und starte sie Später über eclipse neu, funktioniert alles, da die Datenbank schon vorhanden ist. So ganz kann ich mir das nicht erklären. Das anlegen des Objects erfolgt aus einem Fragment heraus in der onPostExecute eines AsyncTask. Hier mal ein paar snippets:
Hier mein DatabaseHelper:
Das ist meine AbstractActivity, von der alle anderen Activities ableiten und deswegen auch den helper haben sollten
Nun das Repository mit der add Methode wo der Fehler passiert.
und zum Abschluss noch der komplette Stacktrace:
Der ursprüngliche Beitrag von 08:46 Uhr wurde um 09:48 Uhr ergänzt:
Ok Problem gelöst.
Ich hatte die Datenbank vorher nicht am default Folder liegen. Das habe ich nun wieder geändert und jetzt habe ich keine Probleme mehr mit der Datenbank, so scheint es zumindest im Moment.
ich bekomme über ORMLite folgenden Fehler:
"Caused by: android.database.sqlite.SQLiteException: cannot commit - no transaction is active"
Komischerweise tritt dieser Fehler nur beim ersten mal App installieren auf. Wenn die Datenbank angelegt wurde und die Tabellen hinzugefügt wurden. Möchte ich nun ein Object in die Datenbank adden bekomme ich genau diesen Fehler. Beende ich die App und starte sie Später über eclipse neu, funktioniert alles, da die Datenbank schon vorhanden ist. So ganz kann ich mir das nicht erklären. Das anlegen des Objects erfolgt aus einem Fragment heraus in der onPostExecute eines AsyncTask. Hier mal ein paar snippets:
Hier mein DatabaseHelper:
Code:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private Dao<Shop, Integer> shopDAO = null;
public DatabaseHelper(Context context) {
super(context, getDBPath(context), null, DATABASE_VERSION);
}
private static final int DATABASE_VERSION = 1;
public static String getDBPath(Context context) {
File file = context.getExternalCacheDir();
if (file == null || !file.exists()) {
// TODO: ERROR
}
return file.getAbsolutePath() + "/db.sqlite";
}
public static void removeDBIfNessecary(Context context) {
try {
File file = new File(context.getExternalCacheDir()
.getAbsolutePath() + "/db.sqlite");
if (file.exists()) {
file.delete();
file = new File(context.getExternalCacheDir().getAbsolutePath()
+ "/db.sqlite-journal");
if (file.exists()) {
file.delete();
}
file = new File(context.getExternalCacheDir().getAbsolutePath());
if (file.exists()) {
file.delete();
}
}
} catch (Exception e) {
}
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource arg1) {
try {
TableUtils.createTable(arg1, Shop.class);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
public Dao<Shop, Integer> getShopDao() throws SQLException {
if (this.shopDAO == null) {
this.shopDAO = getDao(Shop.class);
}
return this.shopDAO;
}
@Override
public void close() {
super.close();
shopDAO = null;
}
}
Das ist meine AbstractActivity, von der alle anderen Activities ableiten und deswegen auch den helper haben sollten
Code:
public abstract class AbstractActivity extends FragmentActivity {
public static DatabaseHelper helper = null;
public AbstractActivity() {
}
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
if (helper == null) {
helper = OpenHelperManager.getHelper(this, DatabaseHelper.class);
}
}
}
Nun das Repository mit der add Methode wo der Fehler passiert.
Code:
public class ShopRepository {
private static ShopRepository _shopRepository;
private DatabaseHelper _db;
public static ShopRepository getInstance(DatabaseHelper db) {
if (_shopRepository == null) {
_shopRepository = new ShopRepository(db);
_shopRepository.init();
}
return _shopRepository;
}
private ShopRepository(DatabaseHelper db) {
this._db = db;
}
private void init() {
try {
Dao<Shop, Integer> shopDAO = _db.getShopDao();
shops = (ArrayList<Shop>) shopDAO.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
}
public boolean add(Shop shop) throws SQLException {
if (!shops.contains(shop)) {
Dao<Shop, Integer> shopDAO = _db.getShopDao();
CreateOrUpdateStatus status = shopDAO.createOrUpdate(shop);
}
return false;
}
und zum Abschluss noch der komplette Stacktrace:
Code:
02-21 08:38:11.990: I/SqliteDatabaseCpp(19688): sqlite returned: error code = 1802, msg = statement aborts at 27: [INSERT INTO `shops` (`Name` ,`Password` ,`ShopName` ,`Token` ,`Url` ,`Username` ,`isPrimary` ) VALUES (?,?,?,?,?,?,?)] , db=xxx
02-21 08:38:11.990: I/SqliteDatabaseCpp(19688): sqlite returned: error code = 1, msg = statement aborts at 2: [COMMIT;] cannot commit - no transaction is active, db=xxx
02-21 08:38:12.000: W/System.err(19688): java.sql.SQLException: Unable to run insert stmt on object com.moneymaker.money.model.Shop@415ee3c8: INSERT INTO `shops` (`Name` ,`Password` ,`ShopName` ,`Token` ,`Url` ,`Username` ,`isPrimary` ) VALUES (?,?,?,?,?,?,?)
02-21 08:38:12.010: W/System.err(19688): at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
02-21 08:38:12.010: W/System.err(19688): at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:124)
02-21 08:38:12.010: W/System.err(19688): at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:363)
02-21 08:38:12.015: W/System.err(19688): at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:306)
02-21 08:38:12.015: W/System.err(19688): at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:332)
02-21 08:38:12.015: W/System.err(19688): at com.moneymaker.money.repository.ShopRepository.add(ShopRepository.java:71)
02-21 08:38:12.020: W/System.err(19688): at com.moneymaker.money.fragments.AddShopFragment$CheckConnectionTask.onPostExecute(AddShopFragment.java:125)
02-21 08:38:12.020: W/System.err(19688): at com.moneymaker.money.fragments.AddShopFragment$CheckConnectionTask.onPostExecute(AddShopFragment.java:1)
02-21 08:38:12.020: W/System.err(19688): at android.os.AsyncTask.finish(AsyncTask.java:602)
02-21 08:38:12.025: W/System.err(19688): at android.os.AsyncTask.access$600(AsyncTask.java:156)
02-21 08:38:12.025: W/System.err(19688): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
02-21 08:38:12.030: W/System.err(19688): at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 08:38:12.030: W/System.err(19688): at android.os.Looper.loop(Looper.java:137)
02-21 08:38:12.035: W/System.err(19688): at android.app.ActivityThread.main(ActivityThread.java:4511)
02-21 08:38:12.035: W/System.err(19688): at java.lang.reflect.Method.invokeNative(Native Method)
02-21 08:38:12.035: W/System.err(19688): at java.lang.reflect.Method.invoke(Method.java:511)
02-21 08:38:12.040: W/System.err(19688): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
02-21 08:38:12.040: W/System.err(19688): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
02-21 08:38:12.040: W/System.err(19688): at dalvik.system.NativeStart.main(Native Method)
02-21 08:38:12.045: W/System.err(19688): Caused by: java.sql.SQLException: inserting to database failed: INSERT INTO `shops` (`Name` ,`Password` ,`ShopName` ,`Token` ,`Url` ,`Username` ,`isPrimary` ) VALUES (?,?,?,?,?,?,?)
02-21 08:38:12.050: W/System.err(19688): at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
02-21 08:38:12.050: W/System.err(19688): at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:134)
02-21 08:38:12.050: W/System.err(19688): at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89)
02-21 08:38:12.050: W/System.err(19688): ... 17 more
02-21 08:38:12.050: W/System.err(19688): Caused by: android.database.sqlite.SQLiteException: cannot commit - no transaction is active
02-21 08:38:12.050: W/System.err(19688): at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:90)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2028)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1968)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:745)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:273)
02-21 08:38:12.055: W/System.err(19688): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
02-21 08:38:12.055: W/System.err(19688): at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:122)
02-21 08:38:12.055: W/System.err(19688): ... 18 more
Der ursprüngliche Beitrag von 08:46 Uhr wurde um 09:48 Uhr ergänzt:
Ok Problem gelöst.
Ich hatte die Datenbank vorher nicht am default Folder liegen. Das habe ich nun wieder geändert und jetzt habe ich keine Probleme mehr mit der Datenbank, so scheint es zumindest im Moment.