7

我有一个 .db 文件,我想在第一次运行我的 android 应用程序时设置它。我使用 OrmLite 来管理我的数据库。

在那个 .db 文件中有大约 7000 条记录,当我想通过常用方法(使用 foreach - create 命令)导入它时,导入需要很长时间(大约 2-3 分钟)。

我怎么解决这个问题?

谢谢

4

2 回答 2

18

假设您有名为“ prepared.db”的数据库,并且您的包名称是“ com.example.android”。这就是我所做的。

  1. 确保您准备的数据库位于资产文件夹下。
  2. 在扩展 OrmLiteSqliteOpenHelper 的类的构造函数中,检查数据库是否存在。
  3. 如果数据库不存在,请从 assets 文件夹中复制 db

(第 2 步和第 3 步都发生在构造函数中)

这是代码示例,它对我有用。

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String DATABASE_NAME = "prepared.db";
    private static final String DATABASE_PATH = "/data/data/com.example.android/databases/";


    public DatabaseHelper(Context context) {
        super(context, DATABASE_PATH+DATABASE_NAME, null, DATABASE_VERSION);

        boolean dbexist = checkdatabase();
        if (!dbexist) {

            // If database did not exist, try copying existing database from assets folder.
            try {
                File dir = new File(DATABASE_PATH);
                dir.mkdirs();
                InputStream myinput = mContext.getAssets().open(DATABASE_NAME);
                String outfilename = DATABASE_PATH + DATABASE_NAME;
                Log.i(DatabaseHelper.class.getName(), "DB Path : " + outfilename);
                OutputStream myoutput = new FileOutputStream(outfilename);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = myinput.read(buffer)) > 0) {
                    myoutput.write(buffer, 0, length);
                }
                myoutput.flush();
                myoutput.close();
                myinput.close();            
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
    * Check whether or not database exist
    */
    private boolean checkdatabase() {
        boolean checkdb = false;

        String myPath = DATABASE_PATH + DATABASE_NAME;
        File dbfile = new File(myPath);
        checkdb = dbfile.exists();

        Log.i(DatabaseHelper.class.getName(), "DB Exist : " + checkdb);

        return checkdb;
    }
}

PS:如果数据库文件大小超过1mb,就会报错。您可以拆分数据库来解决此类问题。

于 2013-11-22T10:56:10.740 回答
0

如果您想将数据作为外部数据库提供,您可以使用转储一个或多个表(定义和数据)

sqlite3 prepared.db ".dump mytable" > dump.sql

并使用导入它们

sqlite3 main.db < dump.sql

如果您想在 Java 中以编程方式进行设置,请确保使用TransactionManager.callInTransaction在一个事务中完成所有操作,因为 SQLite 中的多次提交(自动提交)非常昂贵。

于 2013-11-10T13:55:59.953 回答