J'utilise SQLiteOpenHelper pour l'insertion de données. Je dois insérer 2500 identifiants et 2500 noms, cela prend donc trop de temps. S'il vous plaît, aidez-moi à réduire le temps d'insertion. peut-on insérer plusieurs enregistrements à la fois? quelqu'un m'aide. merci d'avance . code:
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();
}
}
activités 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());
}
}
Utilisez une transaction pour insérer toutes les lignes - PAS une ligne par transaction.
SQLiteDatabase db = ...
db.beginTransaction();
try {
// do ALL your inserts here
db.setTransactionSuccessful()
} finally {
db.endTransaction();
}
MODIFIER
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();
}
}
TOUS les insertions, UNE transaction.
Merci @karakuri . Je passe la liste des identifiants et nom de ville à la fonction add_city, parcourt cette liste et insère toutes les données. À partir de cela, nous pouvons insérer des données dans la base de données en un court laps de temps.
classe de base de données:
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 de données:
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 d'activité:
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;
}
}
essayez SQLiteStatement
2-3 fois plus rapide que 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();
}
}
Placez vos requêtes dans un tableau de chaînes dans string.xml, ouvrez-les dans le code avec le gestionnaire de ressources et exécutez-les en cycle. Avant le cycle, utilisez les méthodes beginTransaction () et entTransaction () pour annuler les modifications en cas d'échec.