2012-05-02 15 views
0

私は複数のテーブルとSQLiteのデータベースでは、しかし、いくつかのテーブルがリンクされていると、いくつかはありませんが、私は何をしたいことは一つのテーブルから読み込まれ、同時に別のテーブルに書き込むことです...ので、私の質問ですここでその私に知らせてください...私は、それぞれのテーブルを指す2つの異なるカーソルを持っているか、他の方法があることができます...提案はAndroidのsqliteは、複数のカーソル

答えて

1

を高く評価しているAsyncQueryHandlerクラスを見てください。それはあなたのContentProviderが非同期/同時クエリを作る

+0

contentprovider用のAsyncQueryHandler複数のテーブルを持つSQLiteデータベースをクエリする必要があります... –

+0

同じデータベースオブジェクトに対して2つのAsyncTaskを同時に実行してみてください。 1つは読み取り操作を処理し、もう1つは書き込み操作を処理します。 – Ika

+0

あなたは私のポイントは私が表Bに表AとカーソルBポイントに私のカーソル..私は同じデータベースに2テーブル表Aと表Bを持っているポイントを説明させ、同時に私は、読み取り/書き込みの両方のカーソルを処理する必要が取得いけません操作そのような状況を処理するための効率的な方法を尋ねたので –

0

あなただけの書き込み、テーブルからデータを読み取るためにカーソルを持っている必要はありません役立ちます。 db内のメソッドを設定して、必要な情報を適切な表に書き出し、アクティビティ内のメソッドを呼び出してカーソルを呼び出し、そこからデータを取得すると、すべて設定されます。

デシベルクラス

public class TestDB { 
    // ******************************************************************* 
    // DB info 
    // ******************************************************************* 
    private static final String TEST_DATABASE_NAME = "TestDB"; 
    private static final int TEST_DATABASE_VERSION = 3; 

    // ******************************************************************* 
    // list table 
    // ******************************************************************* 
    public static final String FIRST_TABLE = "first"; 
    public static final String FIRST_ROWID = "_id"; 
    public static final String FIRST_NAME = "first_name"; 

    private static final String CREATE_FIRST_TABLE = "create table " 
      + LIST_TABLE + " (_id integer primary key autoincrement," 
      + "first_name text not null unique);"; 

    // ******************************************************************* 
    // category table 
    // ******************************************************************* 
    public static final String SECOND_TABLE = "second"; 
    public static final String SECOND_ROWID = "_id"; 
    public static final String SECOND_NAME = "second_name"; 

    private static final String CREATE_SECOND_TABLE = "create table " 
      + CATEGORY_TABLE + " (_id integer primary key autoincrement," 
      + "second_name text not null unique);"; 
    // ******************************************************************* 
    // control variables 
    // ******************************************************************* 
    private DBHelper mDBHelper; 
    private SQLiteDatabase mDb; 
    private final Context mCtx; 

    private static class DBHelper extends SQLiteOpenHelper { 
     DBHelper(Context context) { 
      super(context, TEST_DATABASE_NAME, null, 
        TEST_DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_FIRST_TABLE); 
      db.execSQL(CREATE_SECOND_TABLE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w("TestDB", "Upgrading database from version " + oldVersion 
        + " to " + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS " + FIRST_TABLE); 
      db.execSQL("DROP TABLE IF EXISTS " + SECOND_TABLE); 
      onCreate(db); 
     } 
    } 

    public GroceryDB(Context ctx) { 
     this.mCtx = ctx; 
    } 

    public GroceryDB open() throws SQLException { 
     mDBHelper = new DBHelper(mCtx); 
     mDb = mDBHelper.getWritableDatabase(); 
     return this; 
    } 

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

    // ******************************************************************* 
    // Record creation methods 
    // ******************************************************************* 
    public long createFirst(String name) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(FIRST_NAME, name); 
     return mDb.insertWithOnConflict(FIRST_TABLE, null, initialValues, 
       SQLiteDatabase.CONFLICT_IGNORE); 
    } 

    public long createSecond(String name) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(Second_NAME, name); 
     return mDb.insertWithOnConflict(CATEGORY_TABLE, null, initialValues, 
       SQLiteDatabase.CONFLICT_IGNORE); 
    } 

    // ******************************************************************* 
    // Fetch all records methods 
    // ******************************************************************* 

    public Cursor fetchAllFirst() { 
     return mDb.query(FIRST_TABLE, new String[] { FIRST_ROWID, FIRST_NAME }, 
       null, null, null, null, null); 
    } 

    public Cursor fetchAllSecond() { 
     return mDb.query(SECOND_TABLE, new String[] { SECOND_ROWID, 
       SECOND_NAME }, null, null, null, null, null); 
    } 
} 

次に、あなたの活動のクラスでは、このような何かを行うことができ、あなたがFIRST_TABLEからSECOND_TABLEに最初の項目をコピーしたいと言う:

private Cursor firstCursor; 
private TestDB mDbHelper; 

mDbHelper = new TestDB(getActivity()); 
mDbHelper.open(); 

firstCursor = mDbHelper.fetchAllFirst(); 
getActivity().startManagingCursor(itemCursor); 
firstCursor.moveToFirst; 
mDbHelper.createSecond(firstCursor.getString(1)); 
mDbHelper.close(); 

私は」 (など、あなたの返却カーソルがnullでないことを確認してくださいチェック超えるコピーされるものを選択するようにユーザーにカーソルの内容を表示するように)いくつかの物事を左ましたが、これは一つのテーブルからコピーする一つの方法の基本を示すべき別のものに。

+0

私は@バラックをやっているのですが、別のテーブルで別のカーソルを使うとパフォーマンスが低下すると思います。UIスレッド........ –

関連する問題