web-dev-qa-db-fra.com

comment insérer en vrac dans sqlite dans Android

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

                }
            }
22
kartheeki j

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.

39
Karakuri

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;
        }
    }
4
kartheeki j

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

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.

0
Anton