2012-05-02 3 views
0

나는 여러 테이블과 SQLite 데이터베이스를 가지고 있지만 일부 테이블이 연결되어 있고 일부는 아니지만 내가 원한다면 하나의 테이블에서 읽고 동시에 다른 테이블에 쓰기 ... 그래서 내 질문은 여기에 각각의 테이블을 가리키는 두 개의 다른 커서가 있거나 다른 방법이 있습니다 ... 제게 알려주십시오 ... 제안을 환영합니다여러 테이블에 대한 안드로이드 Sqlite 다중 커서

답변

1

AsyncQueryHandler 클래스를 살펴보십시오. ContentProvider가 비동기식/동시 쿼리를 수행하는 데 도움이됩니다.

+0

contentprovider에 대한 AsyncQueryHandler 의미 여러 테이블을 가진 SQLite 데이터베이스를 쿼리해야합니다 ... –

+0

동일한 데이터베이스 개체에서 두 개의 AsyncTask가 동시에 작동하도록하십시오. 하나는 읽기 작업을 처리하고 다른 하나는 쓰기 작업을 처리합니다. – Ika

+0

당신은 내 포인트를 얻지 못해 내가 두 테이블을 가지고 테이블 A와 테이블 B는 같은 데이터베이스에 .. 내 커서 포인트 테이블 A와 커서 B는 테이블 B를 가리킨 동시에 내가 읽기/쓰기에 대한 커서를 모두 처리해야합니다 작업 그래서 나는 그런 상황을 처리하는 효율적인 방법을 요청했습니다 –

0

쓰기 작업이 아닌 테이블에서 데이터를 읽는 데 커서 만 있으면됩니다. 귀하의 데이터베이스에 적절한 테이블에 필요한 정보를 작성하는 방법을 설정하고 활동에서 커서를 불러 와서 데이터를 가져 오는 방법을 설정하십시오.

다음
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); 
    } 
} 

, 당신은, 당신의 활동 클래스에서이 같은 것을 할 수 SECOND_TABLE하는 FIRST_TABLE에서 첫 번째 항목을 복사하고 싶은 말은 DB 클래스 : 나는 '

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 스레드에 있다고 생각합니다 ........ –

관련 문제