如何将预制db导入ormlite管理的sqlite

时间:2013-11-10 05:54:35

标签: android database sqlite import ormlite

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

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

我该如何解决这个问题?

感谢

2 个答案:

答案 0 :(得分:18)

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

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

    (步骤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;
        }
    }
    

    P.S:如果数据库文件大小超过1mb,则会发生错误。你可以split database to solve这样的问题。

答案 1 :(得分:0)

如果要将数据作为外部数据库提供,可以使用

转储或更多表(定义和数据)
sqlite3 prepared.db ".dump mytable" > dump.sql

并使用

导入它们
sqlite3 main.db < dump.sql

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