1

ほぼ 1 週間、複数のテーブルを持つ SQLite データベースを作成しようとしましたが、成功しませんでした。私は何時間も検索し、ここでトピックに関するすべてのスレッドを調べましたが、何が間違っているのかわかりません.

これは、あるテーブル用のインターネットから取得したコードです。別のテーブルを追加したところ、もう機能しません。

アダプタ:

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

public class WorkingAdapter {

    public static final String WORKINGDATABASE_NAME = "WORKING_DATABASE";
    public static final String WORKINGDATABASE_TABLE = "WORKING_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT = "Content";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_WORKING_DATABASE =
        "create table " + WORKINGDATABASE_TABLE + " ("
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_CONTENT + " text not null);";

    public static final String WORKINGDATABASE_TABLE2 = "MY_TABLE2";
    public static final String KEY_ID2 = "_id2";
    public static final String KEY_CONTENT2 = "Content2";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_WORKING_DATABASE2 =
        "create table " + WORKINGDATABASE_TABLE2 + " ("
        + KEY_ID2 + " integer primary key autoincrement, "
        + KEY_CONTENT2 + " text not null);";

    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public WorkingAdapter(Context c){
        context = c;
    }

    public WorkingAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;    
    }

    public WorkingAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;    
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT, content);
        return sqLiteDatabase.insert(WORKINGDATABASE_TABLE, null, contentValues);
    }

public long insert2(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT2, content);
        return sqLiteDatabase.insert(WORKINGDATABASE_TABLE2, null, contentValues);
    }

    public int deleteAll(){
        return sqLiteDatabase.delete(WORKINGDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE, columns, 
                null, null, null, null, null);

        return cursor;
    }

    public Cursor queueAll2(){
        String[] columns = new String[]{KEY_ID2, KEY_CONTENT2};
        Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE2, columns, 
                null, null, null, null, null);

        return cursor;
    }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_WORKING_DATABASE);
            db.execSQL(SCRIPT_CREATE_WORKING_DATABASE2);

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE);
            db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE2);
            onCreate(db);
        }

    }

}

アクティビティ:

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class AndroidSQLite extends Activity {

    private WorkingAdapter myWorkingAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView listContent = (ListView)findViewById(R.id.contentlist);

        /*
         *  Create/Open a SQLite database
         *  and fill with dummy content
         *  and close it
         */
        myWorkingAdapter = new WorkingAdapter(this);
        myWorkingAdapter.openToWrite();
        myWorkingAdapter.deleteAll();

        myWorkingAdapter.insert("A for Apply");
        myWorkingAdapter.insert("B for Boy");
        myWorkingAdapter.insert("C for Cat");
        myWorkingAdapter.insert("D for Dog");
        myWorkingAdapter.insert("E for Egg");
        myWorkingAdapter.insert("F for Fish");
        myWorkingAdapter.insert("G for Girl");
        myWorkingAdapter.insert("H for Hand");
        myWorkingAdapter.insert("I for Ice-scream");
        myWorkingAdapter.insert("J for Jet");
        myWorkingAdapter.insert("K for Kite");
        myWorkingAdapter.insert("L for Lamp");
        myWorkingAdapter.insert("M for Man");
        myWorkingAdapter.insert("N for Nose");
        myWorkingAdapter.insert("O for Orange");
        myWorkingAdapter.insert("P for Pen");
        myWorkingAdapter.insert("Q for Queen");
        myWorkingAdapter.insert("R for Rain");
        myWorkingAdapter.insert("S for Sugar");
        myWorkingAdapter.insert("T for Tree");
        myWorkingAdapter.insert("U for Umbrella");
        myWorkingAdapter.insert("V for Van");
        myWorkingAdapter.insert("W for Water");
        myWorkingAdapter.insert("X for X'mas");
        myWorkingAdapter.insert("Y for Yellow");
        myWorkingAdapter.insert("Z for Zoo");

        myWorkingAdapter.insert2("W FOR WORKING");

        myWorkingAdapter.close();

        /*
         *  Open the same SQLite database
         *  and read all it's content.
         */
        myWorkingAdapter = new WorkingAdapter(this);
        myWorkingAdapter.openToRead();

        Cursor cursor = myWorkingAdapter.queueAll2();
        startManagingCursor(cursor);

        String[] from = new String[]{WorkingAdapter.KEY_CONTENT};
        int[] to = new int[]{R.id.text};

        SimpleCursorAdapter cursorAdapter =
            new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);

        listContent.setAdapter(cursorAdapter);

        myWorkingAdapter.close();


    }
}

複数のテーブルを持つ SQLite データベースの例を際限なく探しましたが、どれも機能せず、このトピックで見つけたすべてのページで読んだこととまったく同じでした。何が間違っているのか教えてください。

ありがとう :)

4

4 に答える 4

1

変化する

public static final int MYDATABASE_VERSION = 1;

public static final int MYDATABASE_VERSION = 2;

データベースの変更をインクリメントするたびに、onUpgradeのデクリメントがトリガーされ、onDowngradeがトリガーされます(それを行う必要があり、もちろんそれをオーバーライドする場合)

Android 開発者リソースからコンストラクターの詳細を読むことができます

于 2012-07-03T14:44:51.917 に答える
0

_idSQLLiteテーブルの特別な列です。これはすべてのテーブルの主キーであり、正しく覚えていれば、定義しないと自動的に作成されます。_id2どういうわけか問題を引き起こしているように変更したのではないかと思います。したがって、元に戻します。

public static final String KEY_ID2 = "_id";

そして、そのようにしてみてください。

また、(現在のように)アプリは実行するたびにテーブルを作成しようとすることに注意してください。したがって、最初の実行で1番目のテーブルを作成したが、2番目のテーブルの作成に失敗し、エラーを修正してアプリを再実行した場合、今回はすでに作成されているため、1番目のテーブルの作成に失敗します。したがって、これらの問題を回避するには、クリーンインストールを行い、データベースのバージョン管理を適切に処理するようにしてください。

于 2012-07-03T14:41:17.567 に答える
0

試すこと:

  1. SimpleCursorAdapter_idには、その で名前が付けられた列が必要Cursorです。Cursorに という名前の列が含まれていない場合_id、例外がスローされます。

    この問題を解決するには、元に戻し_id2てください。_id

  2. Settings--> Apps--> [your app]--> Clear data(更新された) アプリを実行するたびに移動します。アプリを実行するたびに白紙の状態で作業していることを 100% 確実にしたいので、これは重要です。

  3. ListActivityの代わりに を使用しActivityます。これにより、作業が楽になり (ListView直接処理する必要がなくなり)、エラーの可能性が減る可能性があります。必ず電話setListAdapter(adapter)してくださいonCreate

  4. 使用しないstartManagingCursorでください... Android 3.0 として非推奨です。Android 3.0 で導入されたCursorLoaderとを使用する必要があります(互換性パッケージで Android 1.6 までサポートされています)。LoaderManager

  5. WorkingAdapter複数のインスタンス (または何でも)を作成しないでください。SQLiteDatabaseこれは単にコードを乱雑にし、閉じるのを忘れてリークする可能性を高めているだけです。詳細については、こちらをご覧ください。

    SQLiteDatabase をシングルトンにする方法は?

于 2012-07-03T14:43:07.773 に答える
0

Caner が言ったこと、また、「Content2」として KEY_CONTENT2 は必要ありません。列名はテーブル内で一意であるため、「Content」という名前で十分です。

また、アプリのデータベースをクリアしてみましたか? [設定] -> [アプリケーション] -> [アプリ] -> [データを消去] に移動します。データベースは古いバージョンでバージョン 1 で作成されている可能性がありますが、バージョン 2 を指定していないため、onUpgrade() メソッドは呼び出されません。アプリのデータベースをクリアするか、データベースのバージョンを 2 に上げてください。

于 2012-07-03T14:45:13.047 に答える