2015-08-19 11 views
14

Sto usando SQLiteOpenHelper per l'inserimento dei dati. Devo inserire 2500 id e 2500 nomi, quindi ci vuole troppo tempo. Per favore qualcuno mi aiuti a ridurre il tempo di inserimento. possiamo inserire più record alla volta? qualcuno mi aiuta Grazie in anticipo. Codice:come inserire bulk in sqlite in 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(); 
    } 
} 

attività 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()); 

       } 
      } 

risposta

31

utilizzare una transazione per inserire tutte le righe - non una riga per ogni transazione.

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

tutti gli inserti, una transazione.

+0

ho già fatto solo così .. vedi in "void add_city" –

+1

@kartheekij stai inserendo solo una riga per transazione lì. Sto dicendo di inserire TUTTE le righe nella stessa transazione. – Karakuri

+0

cioè classe db, nella mia classe di attività sto inviando dati json come db.add_city (cityid, cityname); così ... quindi avrò tutti i record ... ma ci vuole troppo tempo per l'inserimento. –

0

Metti le tue query nell'array di stringhe in string.xml, aprile nel codice con il gestore di risorse ed eseguile in ciclo. Prima del ciclo utilizzare i metodi beginTransaction() e entTransaction() per eseguire il rollback delle modifiche in caso di errore.

2

Grazie @karakuri. Ho passato la lista di id della città e nome della città alla funzione add_city e faccio un ciclo attraverso quella lista e inserisco tutti i dati. Da questo possiamo inserire i dati nel database in un breve lasso di tempo.

classe

database:

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

classe di dati:

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

} 

classe di attività:

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

Il blocco del database è bloccato. Come risolvi il problema di blocco del database? –

0

prova SQLiteStatement
a 2-3 volte più veloce di appena 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(); 
    } 
}