Inserting Bulk data taking lot of time Sqlite

前端 未结 2 1169
[愿得一人]
[愿得一人] 2020-12-22 12:48

I am trying to insert 1120 records (records=questions since it is trivia game) in my database but it is taking around 20secs i can\'t even work with insertHelper because it

相关标签:
2条回答
  • 2020-12-22 13:18

    I have used below method for around 1,00,000 rows insert and definitely faster than other. You can try it.

    Instead of one bye one data insert, directly beginTransaction and insert all data and complete transaction.

    Add below code(function) in DatabaseHelper(/DbHelper) class and call that function with arraylist of custom class(DataModel class).

    Make some adding/changes as per your requirement:-

    public void insertBigDataQuickly(ArrayList<DataModel> arrayList) {
        SQLiteDatabase db = this.getWritableDatabase();   //db is instance of DatabaseHelper(/DBHelper) class
        db.beginTransaction();
        try {
            String sql = "Insert or Replace into table_name (column1, column2, column3) values(?,?,?)";
            SQLiteStatement statement = db.compileStatement(sql);
            for (int i = 0; i < arrayList.size(); i++) {  //Loop to insert all data one-by-one with Arraylist data
                DataModel singleData = arrayList.get(i);
                statement.bindString(1, singleData.getValue1());    //1 - Index value of column
                statement.bindLong(2, singleData.getValue2());      //2 - Index value of column
                statement.bindDouble(3, singleData.getValue3());    //3 - Index value of column
                statement.executeInsert();
            }
    
            db.setTransactionSuccessful(); // This commits the transaction
        }catch (Exception e) {
            e.printStackTrace();
            Log.d("Database error: ",e.getMessage());
        }
        finally {
            db.endTransaction();
        }
        db.close();
    }
    
    0 讨论(0)
  • 2020-12-22 13:29

    You can collect your data, put it in a list, then iterate through the list inside a transaction like so:

    private void addAllQuestions(Arraylist<Questions> allQuestions) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.beginTransaction();
        try {
            ContentValues values = new ContentValues();
    
            for (Questions question: allQuestions) {
                values.put(QUESTION, question.getQUESTION());
                values.put(OPTION1, question.getOPT1());
                values.put(ANSWER, question.getANSWER());
                values.put(ANSWER2, question.getANSWER2());
                db = this.getWritableDatabase();
                db.insert(TABLE_NAME, null, values);        
            }
    
            db.setTransactionSuccessful();
    
        } finally {
            db.endTransaction();
        }
    }
    
    public void addquestions() {
        //famous people
        ArrayList<Questions> allQuestions = new ArrayList<Questions>();
    
        allQuestions.append(new Questions("Who was the first African American to have served as president of United States of America ?", "BAROBAACKMAQCAEMBD", "BARACK", "OBAMA"));
    
        allQuestions.append(new Questions("Who co-founded Apple company with Steve Wozniak, Ronald Wayne ?", "TSOVWIBYUBZRGOEJSE", "STEVE", "JOBS"));
    
        this.addAllQuestions(allQuestions);
    }
    

    Based on this: https://stackoverflow.com/a/32088155/4268599

    0 讨论(0)
提交回复
热议问题