2011-01-31 12 views
0

私はまっすぐな質問をしましたが、私はいくつかの点を欠いていると思います。私のテストアプリケーションは、30メガバイトの仮想SDカードを搭載したAVD内で、エミュレータに導入されています。 私は私の主な活動から、次を呼び出します。Android 2.3 Sqlite挿入時のトラブル

DatabaseManager.Initialize(this); 
DatabaseManager.getEntities(); 

マイアプリのクラッシュやデバッガはそのようなテーブルを言いません!テーブルITEMは、データベースヘルパーのonCreate()で作成され、は、が正しく呼び出されます(ステップバイステップデバッグ)。何が私はそこに行方不明ですか?あなたの方向の野郎のための

データベース・マネージャ

public class DatabaseManager { 

public static final String ITEM_CONTACT = "CONT"; 
public static final String ITEM_FILE = "FILE"; 
public static final String ITEM_APP = "AAPP"; 
public static final String ITEM_OPT = "OPTS"; 


private static final String DATABASE_NAME = "androfast.sqlite3.db"; 
private static final Integer DATABASE_VERSION = 1; 
private static final String TABLE_ITEM = "ITEM"; 
private static final String TABLE_KEYWORD = "KEYWORD"; 

private static final String DATABASE_SCHEMA_FILE = "schema.sql"; 

public static final String ITEM_COLUMN_ID = "id"; 
public static final String ITEM_COLUMN_NAME = "name"; 
public static final String ITEM_COLUMN_PACKAGE = "pkg"; 
public static final String ITEM_COLUMN_TYPE = "kind"; 
public static final String ITEM_COLUMN_PRIORITY = "karma"; 

public static final String KEYWORD_COLUMN_ID = "id"; 
public static final String KEYWORD_COLUMN_VALUE = "word"; 
public static final String KEYWORD_COLUMN_PRIORITY = "karma"; 

private static SQLiteDatabase dbSqlite; 
private static DatabaseHelper dbHelper; 
private static Context context; 

public static void Initialize(Context ctx) throws IOException{ 
    context = ctx; 
    InputStream is = ctx.getAssets().open(DATABASE_SCHEMA_FILE); 
    BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder strQuery = new StringBuilder(""); 

    String s; 

    while ((s = r.readLine()) != null){ 
     strQuery.append(s); 
    } 
    r.close(); 

    dbHelper = new DatabaseHelper(ctx, DATABASE_NAME,null, DATABASE_VERSION, strQuery.toString()); 
    dbSqlite = dbHelper.getWritableDatabase(); 
} 

public static SQLiteDatabase getSqliteDatabase(){ 
    return dbSqlite; 
} 

public static void runQuery(String strQuery){ 
    dbSqlite.execSQL(strQuery); 
} 

public static List<Item> getEntities(){ 
    ArrayList<Item> items = new ArrayList<Item>(); 
    Cursor cursor; 

    dbSqlite.execSQL("INSERT INTO ITEM (name, pkg, kind) VALUES('Don Coreleone', 'life.thug.jail', 'CONT')"); 
    dbSqlite.execSQL("INSERT INTO ITEM (name, pkg, kind) VALUES('slavery.png', 'life.thug.jail', 'FILE')"); 
    dbSqlite.execSQL("INSERT INTO ITEM (name, pkg, kind) VALUES('Alcatraz', 'life.thug.jail', 'AAPP')"); 
    dbSqlite.execSQL("INSERT INTO ITEM (name, pkg, kind) VALUES('BLUETOOTH', 'life.thug.jail', 'OPTS')"); 
    dbSqlite.execSQL("INSERT INTO ITEM (name, pkg, kind) VALUES('Che Guevara', 'life.thug.jail', 'CONT')"); 

    cursor = dbSqlite.query(TABLE_ITEM, null,null,null,null,null,null); 

    if (cursor.moveToFirst()){ 
     do{ 
      Log.d("APP/DB", cursor.getString(cursor.getColumnIndex(ITEM_COLUMN_NAME))); 
     }while(cursor.moveToNext()); 
    } 

    cursor.close(); 

    return items; 
} 

} 

データベースヘルパー

public class DatabaseHelper extends SQLiteOpenHelper 
{ 
private static final String LOG_TAG = "SQLiteOpenHelper"; 
private String dbCreateQuery; 

public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, String dbCreate) { 
    super(context, name, factory, version); 
    dbCreateQuery = dbCreate; 
} 

@Override 
public SQLiteDatabase getWritableDatabase() { 
    return super.getWritableDatabase(); //To change body of overridden methods use File | Settings | File Templates. 
} 

@Override 
public SQLiteDatabase getReadableDatabase() { 
    return super.getReadableDatabase(); //To change body of overridden methods use File | Settings | File Templates. 
} 

@Override 
public void close() { 
    super.close(); //To change body of overridden methods use File | Settings | File Templates. 
} 

@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    sqLiteDatabase.execSQL(dbCreateQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
    Log.w(LOG_TAG,"Upgrading database from version " + i + " to version " + i1); 
    // No need to do drops of tables, these must be included in the schema.sql file 
    onCreate(sqLiteDatabase); 
} 

@Override 
public void onOpen(SQLiteDatabase db) { 
    super.onOpen(db); 
} 
} 

おかげ

敬具、

Miloud B.

+0

androfast.sqlite3.dbの内容は興味深いです...貼り付けできますか?あなたはonCreate()が一度だけ呼ばれることを知っていますよね?データディレクトリをクリアして(Appの設定で)、再度実行してみてください。最後に、別の観測として、UIスレッドではなく、AsyncTaskでこれを行うのが大変な作業です。 –

+0

データのクリーニングを試みましたが、実際には別のものを発見しました... onCreateは決して呼び出されません。私はそれが最後に呼ばれたことを100%確信しています... – CoolStraw

+0

Miloud、あなたはadbシェルでsqlite3コマンドを使ってあなたのデータベースの内容を見てみましたか?これは、このような問題をデバッグするのに役立ちました。 http://developer.android.com/guide/developing/tools/adb.html#sqlite –

答えて

0

問題が発生しました。

すべてが次の文である:

*ます。public void ExecSqlの(文字列のSQL)

以降:APIレベル1 クエリではありません単一 SQL文を実行します。たとえば、CREATE TABLE、DELETE、INSERTなどセミコロンで区切られた複数のステートメントは、に対応していないです。書き込みロックを受け取ります*