Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Android 在sqlite3数据库中插入1000000行_Android_Sqlite - Fatal编程技术网

Android 在sqlite3数据库中插入1000000行

Android 在sqlite3数据库中插入1000000行,android,sqlite,Android,Sqlite,我想在数据库中插入10,00000行,但是插入时需要的时间太长了 e、 g.现在我正在用2055行进行尝试,将这些数据上传到数据库需要3分钟。。这一次对于2055个参赛者来说太多了 以下是我将数据插入数据库的方法: public void insert_database(Context context,String field1,String field2,String field3,String field4,String field5,String field6 ,String

我想在数据库中插入10,00000行,但是插入时需要的时间太长了

e、 g.现在我正在用2055行进行尝试,将这些数据上传到数据库需要3分钟。。这一次对于2055个参赛者来说太多了

以下是我将数据插入数据库的方法:

      public void insert_database(Context context,String field1,String field2,String field3,String field4,String field5,String field6 ,String field7,String field8,String field9,String field10)
{

    try
    {
        //RayAllen_Database.beginTransaction();
        RayAllen_Database.execSQL(" insert or replace into "+ TableName_csv+" values( '"+field1+"' ,'"+field2+"','"+field3+"','"+field4+"','"+field5+"','"+field6+"','"+field7+"','"+field8+"','"+field9+"','"+field10+"');");


    }
    catch(Exception e)
    {
        //Log.i("Database Exception", "Exception");
        e.printStackTrace();
    }

}
在另一个名为:解析数据的类中:这里我解析csv文件,同时解析:

试一试{

因此,这里它逐个解析行,并调用insert方法将条目插入数据库


但是这太费时了。如何提高性能???

经历了一个类似的案例,并展示了如何使用事务优化插入。

您可以使用脱机工具填充数据库,然后在安装软件包时导入。您可以将数据库存储在外部sd卡或应用程序的资产文件夹

我就是这样做的:

  • 使用Android调试程序桥(adb)将应用程序数据库复制到本地文件夹,如下所示:
    adb pull/data/data//databases/yourdabase.db C:/users/databases/yourdabase.db

  • 使用您喜爱的GUI/CLI工具连接到SQLite数据库
    C:/users/databases/yourdatbase.db
    ,并完成1000 000条记录的填充

  • 将填充的数据库复制到Android开发环境
    asset
    文件夹中

  • 现在从设备上卸载应用程序,以确保首次安装时没有创建数据库

  • 修改您的SqliteHelper类,以便它检查数据库是否存在,如果存在,则使用该数据库。如果不存在数据库,则帮助程序将从您的资产文件夹中复制该数据库以及1000 000条记录。我就是这样做的:

    public class MyDatabaseHelper extends SQLiteOpenHelper {
    
        /*
            Other SQLiteOpenHelper declarations here ...
        */
    
        private static final String DATABASE_NAME   = "application.db";
        private static final String DB_PATH         = "/data/data/" + context.getPackageName() + "/databases/";
    
    
        /*
            Your SQLiteOpenHelper functions/procedures here ...
        */
    
        public boolean isDataBaseExist() {
    
            File dbFile     = new File(DB_PATH + DATABASE_NAME);
            return dbFile.exists();
        }
    
        public void copyDataBase(Context context) throws IOException {
    
            this.getReadableDatabase();
    
            InputStream inFile      = context.getResources().getAssets().open(DATABASE_NAME);
    
            // Path to the just created empty db
            String outFileName      = DB_PATH + DATABASE_NAME;
            OutputStream outFile    = new FileOutputStream(outFileName);
    
            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
    
            int length;
    
            while ((length = inFile.read(buffer)) > 0) {
    
                outFile.write(buffer, 0, length);
    
            }
    
            // Close the streams
            outFile.flush();
            outFile.close();
            inFile.close();
        } 
    

  • 此数据库将与您的应用程序一起编译,在第一次启动时,所有数据都将在那里。可能有一个更简单的方法,但我希望这对某人有所帮助。

    快速示例时间为什么您应该做正确的事情而不是“错误”。这是在ICS 4.0.4上运行的测试,它具有可怕的插入性能

    首先,一个简单的
    SQLiteOpenHelper
    ,它在一个列上创建一个带有
    UNIQUE
    约束的表,以时不时地引起冲突

    class SimpleHelper extends SQLiteOpenHelper {
        // InsertHelpers are a really good idea - they format a prepared statement
        // for you automatically.
        InsertHelper mInsert;
        public SimpleHelper(Context context) {
            super(context, "tanika.db", null, 1);
        }
        @Override
        public void onOpen(SQLiteDatabase db) {
            super.onOpen(db);
            mInsert = new InsertHelper(db, "target");
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE target (\n" +
                    "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +
                    "val1 TEXT NOT NULL,\n" +
                    "val2 TEXT NOT NULL,\n" +
                    "val3 TEXT NOT NULL,\n" +
                    // Let's make one unique so we can get some juicy conflicts
                    "val4 TEXT NOT NULL UNIQUE\n" +
                    ")");
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
    
    捆绑在任何旧的
    活动中
    我们添加了以下简单的测试方法:

    long test(final int n) {
        long started = System.currentTimeMillis();
        ContentValues values = new ContentValues();
    
        for (int i = 0; i < n; i++) {
            values.clear();
            // Every 20th insert, generate a conflict in val4
            String val4 = String.valueOf(started + i);
            if (i % 20 == 0) {
                val4 = "conflict";
            }
            values.put("val1", "Value1");
            values.put("val2", "Value2");
            values.put("val3", "Value3");
            values.put("val4", val4);
            mHelper.mInsert.replace(values);
        }
        return System.currentTimeMillis() - started;
    }
    
    一切都是这样开始的:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        mHelper = new SimpleHelper(this);
        mHelper.getWritableDatabase(); // Forces the helper to initialize.
        new Test1().execute(2055);
        new Test2().execute(2055);
    }
    

    结果如何?如果没有事务,
    INSERT
    s需要41072ms。如果事务需要940ms。简言之,FFS,开始使用
    InsertHelper
    s和事务。

    准备一条语句,并将其用于会话中的所有插入。这将加快速度。您有理由解析CSV并填充吗设备上的DB?是否可以脱机执行?但我正在获取csv文件,因此我需要逐行读取它以将其保存到database@SarwarErfan:你能给我一个preparedStatement的例子吗?插入1000万行对于一个简单的智能手机来说是一件很难处理的事情…CSV文件是在哪里创建的?你能复制/创建SQLite数据吗在服务器上使用ase并发送一个准备运行的数据库?InsertHelper不推荐使用。在android中是否有其他方法可以更快地插入数据库。
    class Test1 extends AsyncTask<Integer, Void, Long> {
        @Override
        protected Long doInBackground(Integer... params) {
            return test(params[0]);
        }
        @Override
        protected void onPostExecute(Long result) {
            System.out.println(getClass().getSimpleName() + " finished in " + result + "ms");
        }
    }
    
    class Test2 extends AsyncTask<Integer, Void, Long> {
        protected Long doInBackground(Integer... params) {
            SQLiteDatabase db = mHelper.getWritableDatabase();
            db.beginTransaction();
            long started = System.currentTimeMillis();
            try {
                test(params[0]);
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
            return System.currentTimeMillis() - started;
        }
        @Override
        protected void onPostExecute(Long result) {
            System.out.println(getClass().getSimpleName() + " finished in " + result + "ms");
        }
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        mHelper = new SimpleHelper(this);
        mHelper.getWritableDatabase(); // Forces the helper to initialize.
        new Test1().execute(2055);
        new Test2().execute(2055);
    }