Android Sqlite-使用事务在更多表上插入6000条记录,正确的方法?

Android Sqlite-使用事务在更多表上插入6000条记录,正确的方法?,android,sqlite,transactions,locking,Android,Sqlite,Transactions,Locking,我是Android新手。我在Android上的Sqlite数据库中插入6000条记录时遇到了一个问题,其中包括4个表。在单个表中插入记录意味着在其他表中插入其他记录。考虑到记录的数量,我发现我需要使用事务,但由于采用了与数据库相关的类的结构,这是不可能的(因为锁定) 为了简化,下面插入POI和图像(以及辅助对象)的代码。什么是正确的方法?静态助手?静态数据库?谢谢大家 助手 public class PoiDatabaseHelper extends SQLiteOpenHelper {

我是Android新手。我在Android上的Sqlite数据库中插入6000条记录时遇到了一个问题,其中包括4个表。在单个表中插入记录意味着在其他表中插入其他记录。考虑到记录的数量,我发现我需要使用事务,但由于采用了与数据库相关的类的结构,这是不可能的(因为锁定)

为了简化,下面插入POI和图像(以及辅助对象)的代码。什么是正确的方法?静态助手?静态数据库?谢谢大家

助手

    public class PoiDatabaseHelper extends SQLiteOpenHelper {

        private static final String DB_NAME = "poi_database"; 
        private static final int DB_VERSION = 1; 

        public PoiDatabaseHelper(Context context) { 
            super(context, DB_NAME, null, DB_VERSION); 
        } 

        @Override
        public void onCreate(SQLiteDatabase db) { 
            String poiTable = ""; 
            poiTable += "CREATE TABLE poi ("; 
            poiTable += " poi_id INTEGER,"; 
            poiTable += " name TEXT NOT NULL,"; 
            poiTable += " description_en TEXT,"; 
            poiTable += " description_it TEXT,"; 
            poiTable += " time TEXT,"; 
            poiTable += " address TEXT,";
            poiTable += " latitude TEXT,"; 
            poiTable += " logitude TEXT,"; 
            poiTable += " primary key  (poi_id)";
            poiTable += ")"; 

            String imgTable = "";
            imgTable += "CREATE TABLE image ("; 
            imgTable += " image_id INTEGER,"; 
            imgTable += " url TEXT,"; 
            imgTable += " thumb INTEGER,";
            imgTable += " poi_id INTEGER NOT NULL,";
            imgTable += " primary key  (image_id),";
            imgTable += " foreign key (poi_id) references poi(poi_id) on delete set NULL on update cascade";
            imgTable += ")";
} 

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
        //TODO
    }

}
POI插入

public class PoiDaoImpl implements PoiDao {

    private Context context;
    private PoiDatabaseHelper poiDatabaseHelper;
    private SQLiteDatabase poiDatabase;

    public PoiDaoImpl(Context context) {
        this.context = context;
        poiDatabaseHelper = new PoiDatabaseHelper(context);
        poiDatabase = poiDatabaseHelper.getWritableDatabase();

    }

    @Override
    public void insert(Poi poi) {
        ContentValues values = new ContentValues(); 

        values.put("poi_id", poi.getId());
        values.put("name", poi.getName());
        values.put("description_en", poi.getDescriptionEn());
        values.put("description_it", poi.getDescriptionIt());
        values.put("time", poi.getTime());
        values.put("address", poi.getAddress());
        values.put("latitude", poi.getCoordinates().getLatitude());
        values.put("logitude", poi.getCoordinates().getLongitude());


        ImageDao imageDao = new ImageDaoImpl(context);
        for(Image image: poi.getImages()) {
            if(!image.getUrl().equals("")) {
                imageDao.insert(image, poi.getId());
            }
        }

        long id = poiDatabase.insert("poi", null, values); 
        //poiDatabase.close();

        //poiDatabaseHelper.close();

    }


    @Override
    public void insertAllPois(List<Poi> pois) {
        poiDatabase.beginTransaction();
        try {
            for(Poi poi: pois) {
                insert(poi);
            }
            poiDatabase.setTransactionSuccessful();
        } finally {
            poiDatabase.endTransaction();
        }


    }
}
public class ImageDaoImpl implements ImageDao {

    private Context context;
    private PoiDatabaseHelper poiDatabaseHelper;
    private SQLiteDatabase poiDatabase;


    public ImageDaoImpl(Context context) {
        this.context = context;
        poiDatabaseHelper = new PoiDatabaseHelper(context);
        poiDatabase = poiDatabaseHelper.getWritableDatabase();

    }

    @Override
    public void insert(Image image, int idPoi) {
        ContentValues values = new ContentValues(); 
        values.put("url", image.getUrl());
        if(image.getThumb()) {
            values.put("thumb", 1);
        }
        else {
            values.put("thumb", 0);
        }

        values.put("poi_id", idPoi);
        //poiDatabase = poiDatabaseHelper.getWritableDatabase();
        long id = poiDatabase.insert("image", null, values);
        poiDatabase.close();
    }
}

有了这些代码,我在使用多线程方面没有问题。我看到您没有使用helper的唯一实例

我以这种方式给出helper实例->
db讲师a=ControladorBBDD.getBBDD(_ctx)
其中
\u ctx=activity\u p.getApplicationContext()

public class ControladorBBDD extends SQLiteOpenHelper 
private static ControladorBBDD instancia;

private ControladorBBDD(Context ctx_p) throws Exception {

        super(ctx_p, DB_NAME, null, DATABASE_VERSION);
        try {
            ControladorBBDD.ctx = ctx_p;
            DB_PATH = ctx.getDatabasePath(DB_NAME).getAbsolutePath();
            String myPath = DB_PATH;// + DB_NAME;
            this.createDataBase();

            db = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);

        } catch (SQLiteException ex) {
            Log.e(TAG+".ControladorBBDD", ex.getMessage());
            Conexiones.escribirLog("Error "+TAG+".ControladorBBDD: " + Log.getStackTraceString(ex));
            db.close();
        }
    }

public static synchronized ControladorBBDD getBBDD(Context ctx_p)
                throws Exception {
            if (instancia == null) {
                instancia = new ControladorBBDD(ctx_p);
            }
            return instancia;
        }