una tutorial tabla studio para mostrar hacer fichero español ejemplo datos consultas conexion como actualizar acceder android sqlite sqliteopenhelper

tutorial - sqlite android studio ejemplo



cómo hacer inserciones masivas en sqlite en android (4)

Estoy usando SQLiteOpenHelper para la inserción de datos. Necesito insertar 2500 ID y 2500 nombres, así que toma demasiado tiempo. Por favor, que alguien me ayude a reducir el tiempo de inserción. ¿Podemos insertar múltiples registros a la vez? alguien me ayude gracias de antemano. código:

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

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


Gracias @karakuri. Paso la lista de ID de ciudad y nombre de ciudad a la función add_city y recorro esa lista e inserto todos los datos. A partir de esto podemos insertar datos en la base de datos en poco tiempo.

clase de base de datos:

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

clase de datos:

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

clase de actividad:

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


Ponga sus consultas en la matriz de cadenas en string.xml, ábralas en código con el manejador de recursos y realicelas en ciclo. Antes del ciclo, utilice los métodos beginTransaction () y entTransaction () para revertir los cambios en caso de fallo.


Use una transacción para insertar todas las filas, NO una fila por transacción.

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

EDITAR

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

TODOS los insertos, UNA transacción.


prueba SQLiteStatement
en 2-3 veces más rápido que apenas 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(); } }