Невозможно создать базу данных Android SQLite: ошибка PRAGMA - PullRequest
4 голосов
/ 06 марта 2011

Ошибка:

E/Database( 8614): Failure 21 (out of memory) on 0x0 when preparing 'PRAGMA user_version = 1'.
E/Database( 8614): Failure 21 (out of memory) on 0x0 when preparing 'ROLLBACK;'.
D/Database( 8614): exception during rollback, maybe the DB previously performed an auto-rollback
D/AndroidRuntime( 8614): Shutting down VM
W/dalvikvm( 8614): threadid=3: thread exiting with uncaught exception (group=0x4001dc20)
E/AndroidRuntime( 8614): Uncaught handler: thread main exiting due to uncaught exception

Мой текущий код:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

   private static String DatabaseName = "Entries.db"; 

   public Database(Context context) {
      super(context, DatabaseName, null, 1);
   }

   public void onCreate(SQLiteDatabase D) {
      D.execSQL(
            "CREATE TABLE Containers ("
            + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "Parent INTEGER,"
            + "Sequence INTEGER,"
            + "Name TEXT"
            + ")"
      );
      D.execSQL(
            "CREATE TABLE Files ("
            + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "Parent INTEGER,"
            + "Sequence INTEGER,"
            + "Name TEXT,"
            + "Text TEXT"
            + ")"
      );
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 2, \"TestLine2\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 1, \"TestLine1\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 3, \"TestLine3\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (2, 1, \"TestLine2-1\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (2, 2, \"TestLine2-2\")");
      D.close();
   }

   @Override
   public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
   }

   public static Cursor Query(Context context, String SQL) {
      StartQuerySeries(context);
      Cursor Result = Query(SQL);
      StopQuerySeries();
      return Result;
   }

   private static Database D = null;
   public static void StartQuerySeries(Context context) {
      D = new Database(context);
   }
   public static Cursor Query(String SQL) {
      SQLiteDatabase X = D.getWritableDatabase();
      return X.rawQuery(SQL, null);
   }
   public static void StopQuerySeries() {
      D.close();
      D = null;
   }

}

Ошибка возникает, когда в основной активности она называется так:

Database.Query(this, "INSERT INTO Files (Parent, Sequence, Name, Text) VALUES (1, 1, \"Item1\", \"Item1 Text\")");

Ошибка возникает в строке "D.getWritableDatabase ()" ... Наиболее близкая вещь, которую я могу найти, в http://www.sqlite.org/c3ref/c_abort.html, что Ошибка 21 говорит: "Библиотека использовалась неправильно" - любая помощь?

Да, и я проверил - файл базы данных создается, но в нем нет таблиц, так что onCreate () выше не вызывается.

Ответы [ 3 ]

6 голосов
/ 06 марта 2011

У меня та же проблема 2 минуты назад.Я решил это, удалив строку D.close().

Кажется, что Android не нравится, когда вы закрываете переданный SQLiteDatabase Объект.Я думаю, что окружающий код, который вызывает метод onCreate(), уже управляет открытием и закрытием базы данных правильно.Так что вам нужно сделать все, чтобы поднять столы.

Может быть, после создания таблиц с этим объектом была проделана определенная работа.Я хотел бы знать, решает ли это и вашу проблему.

Мне также очень хотелось бы услышать точное объяснение этого поведения.

1 голос
/ 16 марта 2011

Большое спасибо !!!

Симптом: у меня был точно такой же ... Мне удалось создать файл базы данных, но не таблицы, и я получил следующую ошибку в LogCat

03-16 09:55:12.093: ERROR/Database(224): Failure 21 (out of memory) on 0x0 when preparing 'ROLLBACK;'.<BR>
03-16 09:55:12.093: DEBUG/Database(224): exception during rollback, maybe the DB previously performed an auto-rollback

Как я это исправил: я последовал вашему совету, просто удалите инструкцию "db.close", которую я добавил после db.execSQL("CREATE TABLE .... в моей процедуре onCreate, и я отлично работал.

0 голосов
/ 29 марта 2011

Удалите db.close () в методе onCreate

@Override
public void onCreate(SQLiteDatabase db)

Не вызывайте SQLiteDatabas # close ();

...