how to bulk insert in sqlite in android

前端 未结 5 1073
野趣味
野趣味 2020-12-03 10:09

I am using SQLiteOpenHelper for data insertion. I need to insert 2500 id and 2500 names, So it takes too much time. Please any one help me how to reduce the insertion tim

相关标签:
5条回答
  • 2020-12-03 10:21

    Thank you @karakuri. i pass the list of city id and city name to add_city function and loop through that list and insert all the data. From this we can insert data to database in a small amount of time.

    database class:

    public void add_cities(ArrayList<Cities> list) {
            SQLiteDatabase db = this.getWritableDatabase();
            db.beginTransaction();
            try {
                ContentValues values = new ContentValues();
                for (Cities city : list) {
                    values.put(CityId, city.getCityid());
                    values.put(CityName, city.getCityname());
                    db.insert(TABLE_CITY, null, values);
                }
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
        }
    

    data class:

    public class Cities {
        public String getCityid() {
            return cityid;
        }
    
        public void setCityid(String cityid) {
            this.cityid = cityid;
        }
    
        public String getCityname() {
            return cityname;
        }
    
        public void setCityname(String cityname) {
            this.cityname = cityname;
        }
    
        @Expose
    
        private String cityid="0";
    
        @Expose
        private String cityname="";
    
        public Cities(){
        }
    
    }
    

    activity class:

     ArrayList<Cities> mCities;
         protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_splash);
                db = new DatabaseHandler(getApplicationContext());
               executeCircleAndOperatorsList();
    
            }
          void executeCircleAndOperatorsList() {
         db.ClearTables();
                ServiceClient serviceClient = ServiceUtil.getServiceClient();
                JsonParser jsonParser = new JsonParser();
    
               mCitiesCallback = new CancelableCallback(citiescallback);
    
                serviceClient.getCities("getCities_v1", mCitiesCallback);
        }
        Callback<JsonObject> citiescallback=new Callback<JsonObject>() {
    
                @Override
                public void success(final JsonObject jsonObject, Response response) {
                    Thread t=new Thread(new Runnable() {
                        @Override
                        public void run() {
                            parsecities(jsonObject);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(), "msg msg", Toast.LENGTH_SHORT).show();
    
                                    Intent intent=new Intent(SplashActivity.this,LoginAcivtiy.class);
                                    startActivity(intent);
                                }
                            });
                        }
                    });
                    t.start();
    
                }
    
                @Override
                public void failure(RetrofitError error) {
    
                }
            };
            public void parsecities(JsonObject result) {
                //Log.v("TAG_RESULT", "" +result.toString());
                try{
                    String Status = result.get("Status").getAsString();
                    if (TextUtils.equals(Status, "true")) {
                        Gson gson = new Gson();
    
                        JsonArray array = result.get("data")
                                .getAsJsonArray();
                        Type type = new TypeToken<ArrayList<Cities>>() {
                        }.getType();
                        setmCities((ArrayList<Cities>) gson.fromJson(array, type));
                        long start = System.currentTimeMillis();
                        db.add_cities(mCities);
    
                        System.out.println(System.currentTimeMillis() - start);
                        circle_list=db.get_cities();
                        Log.v("TAG_CIRCLELIST",""+circle_list);
    
    
    
                    }
                    else if (TextUtils.equals("Status", "false")) {
    
                        // showToast(operators.getMessage());
    
                    } else {
                        throw new JSONException("Something went wrong ");
                    }        }catch(Exception e){
                    e.printStackTrace();
    
                }
    
            }
          public void setmCities(ArrayList<Cities> mCities) {
                this.mCities = mCities;
            }
        }
    
    0 讨论(0)
  • 2020-12-03 10:21

    It is late for this answer but i could help the others to insert many rows in a simple way there is a way to insert many rows lets create the values we want to insert (add a loop according to your values)

    public String getMultiInsertValues(){
          StringBuilder valueToInsert = new StringBuilder()
    //start loop
          valueToInsert.append("(")
          valueToInsert.append(id)
          valueToInsert.append("),")
          valueToInsert.append("(")
          valueToInsert.append(name)
          valueToInsert.append("),")
    //end of the loop      
          valueToInsert.deleteCharAt(valueToInsert.lastIndexOf(","))
          valueToInsert.append(";")
          return valueToInsert.toString()
    }

    then we will add this value to sql

        String sql = "INSERT INTO " + tableName + " ( id ) VALUES \n" + valueToInsert 
        //value to Insert from the last function

    finally we should execute this sql

    SQLiteDatabase db = getWritableDatabase();
    db.execSQL(sql);
    note there is max variables and terms conditions in sqLite you should devide your values by 500 and insert each 500 using the above solution, since there will be more than one sql query i suggest you to use beginTransaction like whats mentioned in the other answers

    0 讨论(0)
  • 2020-12-03 10:37

    Use a transaction to insert all the rows -- NOT one row per transaction.

    SQLiteDatabase db = ...
    db.beginTransaction();
    try {
        // do ALL your inserts here
        db.setTransactionSuccessful()
    } finally {
        db.endTransaction();
    }
    

    EDIT

    public void add_cities(List<Cities> list) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.beginTransaction();
        try {
            ContentValues values = new ContentValues();
            for (Cities city : list) {
                values.put(CityId, city.getCityid());
                values.put(CityName, city.getCityName());
                db.insert(TABLE_CITY, null, values);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }
    

    ALL inserts, ONE transaction.

    0 讨论(0)
  • try SQLiteStatement
    in 2-3 times faster than just beginTransaction()

    public void add_cities(ArrayList<Cities> list) {
        SQLiteDatabase database = this.getWritableDatabase();
        String sql = "INSERT INTO " + TABLE_NAME + " VALUES(?, ?)";
        SQLiteStatement statement = database.compileStatement(sql);
        database.beginTransaction();
        try {
            for (Cities c : list) {
                statement.clearBindings();
                statement.bindLong(1, c.getCityId());
                statement.bindLong(2, c.getCityName());
                statement.execute();
            }
            database.setTransactionSuccessful();
        } finally {
            database.endTransaction();
        }
    }
    
    0 讨论(0)
  • 2020-12-03 10:45

    Put your queries in string array in string.xml, open them in code with resource handler and perform them in cycle. Before cycle use beginTransaction() and entTransaction() methods to rollback changes in case failure.

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