2015-08-19 2 views
14

Я использую SQLiteOpenHelper для ввода данных. Мне нужно вставить 2500 идентификаторов и 2500 имен, поэтому требуется слишком много времени. Пожалуйста, помогите мне, как уменьшить время вставки. мы можем вставить несколько записей за раз? кто-нибудь мне помогает. заранее спасибо. код:как вставить в sqlite в android

public class DatabaseHandler extends SQLiteOpenHelper { 
    SQLiteDatabase db; 
    private static final int DATABASE_VERSION = 8; 
    private static final String TABLE_CITY = "CITYDETAILS"; 
    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.mContext = context; 
} 

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CITY); 
    String CREATE_CITY_TABLE = "CREATE TABLE " + TABLE_CITY + "(" 
       + CityId + " INTEGER," + CityName + " TEXT " + ")"; 
    db.execSQL(CREATE_CITY_TABLE); 
    db.execSQL(CREATE_RechargeTypes_TABLE); 
    this.db=db; 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Drop older table if existed 
    // Create tables again 
    onCreate(db); 
} 

public void add_city(String cityid,String cityname){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.beginTransaction(); 
    ContentValues values = new ContentValues(); 
    values.put(CityId, cityid); 
    values.put(CityName, cityname); 
    db.insert(TABLE_CITY, null, values); 
    db.insertWithOnConflict(TABLE_CITY, null, values, SQLiteDatabase.CONFLICT_IGNORE); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
    } 
} 

активность Calss:

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)); 
       for(int i=0;i< array.size();i++) { 

        db.add_city(mCities.get(i).getCityid(),mCities.get(i).getCityname()); 

       } 
      } 

ответ

31

Используйте транзакцию, чтобы вставить все строки - не одну строку для каждой сделки.

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

РЕДАКТИРОВАТЬ

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(); 
    } 
} 

Все вставки, одну транзакцию.

+0

i уже сделано, как это только .. см. В "void add_city" –

+1

@kartheekij вы вставляете только одну строку за транзакцию. Я говорю вставить ВСЕ строки в одну транзакцию. – Karakuri

+0

, который является классом db, в моем классе активности я отправляю данные json, такие как db.add_city (cityid, cityname); как это ... так что я получу все записи ... но это займет слишком много времени для вставки. –

0

Поместите свои запросы в строковый массив в файле string.xml, откройте их в коде обработчиком ресурсов и выполните их в цикле. Перед использованием цикла используйте методы beginTransaction() и entTransaction() для отката изменений в случае отказа.

2

спасибо @karakuri. Я передаю список имени города и имени города функции add_city и прохожу через этот список и вставляю все данные. Из этого мы можем вставлять данные в базу данных в течение небольшого промежутка времени.

класс

базы данных:

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(); 
     } 
    } 

класс данных:

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(){ 
    } 

} 

Класс активности:

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

попробовать SQLiteStatement
в 2-3 раза быстрее, чем просто 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(); 
    } 
} 
Смежные вопросы