2016-12-29 1 views
0

Как бы вы это сделали? Я не нашел никаких хороших ресурсов или решений для этого после довольно многого поиска.Java - Каков наиболее эффективный способ скопировать содержимое Android Cursor в новую базу данных SQLite?

+0

Где вы получите 'Cursor' от? Если ответ «из SQLite», используйте «ATTACH DATABASE» и полностью переносите свои данные в SQLite, если сможете. Кроме того, использование «курсора» в качестве источника данных не влияет на производительность Java-> SQLite, поэтому применяются все стандартные правила (например, использование транзакций для минимизации записи на диск). – CommonsWare

+0

@CommonsWare Я получил курсор из поставщика контактов ... это считается «из SQLite» и я могу использовать 'ATTACH DATABASE'? Если нет, то я буду использовать стандарты. Спасибо! – conjenks

+0

Не совсем. Да, контакты, вероятно, хранятся в базе данных SQLite, но это не ваша база данных - у вас нет прямого доступа к файловой системе. Я подумал, возможно, что вы внедряете какую-то резервную или архивационную систему, или вы переходите из незашифрованной базы данных в зашифрованную или что-то в этом роде. В этих случаях вы будете «владеть» обеими базами данных, и прямая передача данных SQLite-> SQLite будет вариантом. – CommonsWare

ответ

0

Сначала убедитесь, что вы создали новый класс базы данных, в котором есть нужные вам таблицы. После этого вы можете использовать метод insertCursorInDb. Также вызовите open() один раз, это позволит вам писать в базу данных.

public class YourDatabase extends SQLiteOpenHelper { 

    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "yourdatabase.db"; 
    private SQLiteDatabase database; 

    public YourDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    public void open() throws SQLException { 
     database = this.getWritableDatabase(); 
    } 

    private void create(SQLiteDatabase database) { 
     database.execSQL("CREATE TABLE contacts (TEXT `name`, TEXT `number`)"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     create(database); 
    } 

    // this function depends on the values in your cursor 
    public void insertCursorInDb(Cursor cursor) { 
     if (cursor != null) { 
      while (cursor.moveToNext()) { 
       database.execSQL("INSERT INTO contacts(`name`, `number`) VALUES (?, ?)", new String[]{cursor.getString(0), cursor.getString(1)}); 
      } 
      cursor.close(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
    } 
} 

Как было предложено, вы можете также использовать ContentValues, то он будет так:

// this function depends on the values in your cursor 
    public void insertCursorInDb(Cursor cursor) { 
     if (cursor != null) { 
      while (cursor.moveToNext()) { 
       ContentValues values = new ContentValues(); 
       values.put("name", cursor.getString(0)); 
       values.put("number", cursor.getString(1)); 
       database.insertOrThrow("contacts", null, values); 
      } 
      cursor.close(); 
     } 
    } 
+0

Красивая! Спасибо. – conjenks

+0

Пожалуйста, отметьте его как ответ, если он вам помог :) –

+0

Конечно, нужно подождать 4 минуты, хотя :) – conjenks

Смежные вопросы