2011-03-06 13 views
4

エラー:は、Android SQLiteデータベースを作成できません:PRAGMAエラー

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()"行でエラーが発生しました...私が見つけることができる最も近いのは、です:「ライブラリが正しく使用されていません」というエラー21が表示されます。

私はチェックしました。データベースファイルは作成されますが、そこにはテーブルが存在しないため、上記のonCreate()は呼び出されません。

答えて

6

2分前に同じ問題が発生しました。私はD.close()行を削除して解決しました。

渡されたSQLiteDatabaseオブジェクトを閉じると、アンドロイドが気に入らないようです。私は、onCreate()メソッドを呼び出す周辺のコードは、すでにデータベースのオープンとクローズを正しく管理していると思います。だから、テーブルを手に入れるためにはすべてをやらなければなりません。

多分、テーブルを作成した後にこのオブジェクトに対して行われた作業があります。私はこれもあなたの問題を解決するかどうかを知りたいです。

この動作の正確な説明を聞くことも大好きです。

+0

私は 'onCreate()'で1行を削除した後、2行の 'Dclose()'行を持っていることに気付きました。ありがとう! – Izkata

+0

この動作の説明については、http://stackoverflow.com/questions/5324241/what-happens-to-sqlitedatabase-object-which-is-passed-to-oncreate-methodを参照してください。 – Chris

1

ありがとうございます!

症状: は、私が作成したデータベースファイルを取得することに成功したではなく、テーブル と私は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 

に、次のエラーを取得した ...私にとってはまったく同じでした: 私はあなたの助言に従いました。私がonCreate手続きで db.execSQL("CREATE TABLE ....の後に追加した "db.close"命令を削除して、私は完璧に働きました。

+0

今私はさらになぜこれが起こるかに興味があります。だから私はここに理由に関する新しい質問を開いた:http://stackoverflow.com/questions/5324241/what-happens-to-sqlitedatabase-object-which-is-passed-to-oncreate-method – Chris

0

方法で()db.closeを削除するのonCreate

@Override 
public void onCreate(SQLiteDatabase db) 

)(SQLiteDatabas番号の近くを呼び出さないでください。

関連する問題