Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—将Android游标的内容复制到新的SQLite数据库中最有效的方法是什么?_Java_Android_Sqlite_Cursor - Fatal编程技术网

Java—将Android游标的内容复制到新的SQLite数据库中最有效的方法是什么?

Java—将Android游标的内容复制到新的SQLite数据库中最有效的方法是什么?,java,android,sqlite,cursor,Java,Android,Sqlite,Cursor,你打算怎么做?经过一段时间的谷歌搜索,我还没有找到任何好的资源或解决方案。首先,确保创建一个新的数据库类,该类包含您需要的表。之后,您可以使用insertCursorInDb方法。还可以调用open()一次,这样可以写入数据库 public class YourDatabase extends SQLiteOpenHelper { // If you change the database schema, you must increment the database version.

你打算怎么做?经过一段时间的谷歌搜索,我还没有找到任何好的资源或解决方案。

首先,确保创建一个新的数据库类,该类包含您需要的表。之后,您可以使用
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();
        }
    }

您从何处获得
光标
?如果答案是“来自SQLite”,请使用
附加数据库
,并尽可能将数据完全迁移到SQLite中。除此之外,使用
游标
作为数据源并不会真正影响Java->SQLite性能,因此所有标准规则都适用(例如,使用事务来最小化磁盘写入)。@Commonware我从Contacts Provider获得了游标。。。这被认为是“来自SQLite”,我可以使用
附加数据库
?如果没有,那么我将继续使用这些标准。非常感谢。不是真的。是的,联系人可能存储在SQLite数据库中,但它不是您的数据库——您没有对它的直接文件系统访问权。我想可能您正在实施某种备份或归档系统,或者您正在从未加密的数据库迁移到加密的数据库,或者类似的东西。在这些情况下,您将“拥有”这两个数据库,直接SQLite->SQLite数据传输将是一个选项。太棒了!谢谢。如果有帮助,请将其标记为答案:)当然,需要等待4分钟:)有些可能会使这更容易。