Android Sugar ORM con DB existente y ruta de archivo personalizada

Soy perfectamente capaz de utilizar Sugar ORM usando ejemplos proporcionados.

En mi usecase descarga un SQLite DB desde el servidor (carga ETL para que esté en millones de registros por lo que tiene que ser hecho lado del servidor). La descarga se guarda en una ruta personalizada en el almacenamiento interno.

En mi caso no necesito creación de DB dinámica basada en POCOs.

¿Es posible usar Sugar ORM con BD de SQLite preexistente, apuntando a una ruta personalizada, siempre que todos los campos de clases POCO coincidan con la estructura de tabla?

La solución que encontré, fue poniendo su archivo DB dentro de la carpeta de activos. En lugar de leer un archivo .csv para crear un archivo .db (al iniciar la actividad adecuada) primero intente comprobar si el archivo .db está en /data/data/file.db, si no lo es, cópielo desde Su carpeta de activos a esa ruta. Con el siguiente código podrás hacer todo:

protected void copyDataBase() throws IOException { //Open your local db as the input stream InputStream myInput = getApplicationContext().getAssets().open("file.db"); // Path to the just created empty db String outFileName = "/data/data/com.yourpackagename/databases/" + "file.db"; //Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } //Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } protected boolean checkDataBase(){ SQLiteDatabase checkDB = null; try{ String myPath = "/data/data/com.yourpackage/databases/" + "file.db"; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); }catch(SQLiteException e){ //database does't exist yet. } if(checkDB != null){ checkDB.close(); } return checkDB != null ? true : false; } 
  1. En primer lugar, no estoy cómodo con la idea de que Sugar extiende la clase de aplicación. ¿Qué pasa si tengo otras tareas que deben realizarse antes de que empiece la aplicación? Así que vamos a extender SugarApp con nuestra propia AppClass y luego registrar el nombre appClass en manifiesto. Además, este es el lugar correcto para init db la primera vez que creo.

     public class MyAppStartClass extends SugarApp { @Override public final void onCreate() { init(); super.onCreate(); } private void init() { initDB(); } private void initDB() { try { if (!doesDatabaseExist(this, consts.dbPath)) { Context context = getApplicationContext(); SQLiteDatabase db = context.openOrCreateDatabase(consts.dbName, context.MODE_PRIVATE, null); db.close(); InputStream dbInput = getApplicationContext().getAssets().open(consts.dbName); String outFileName = consts.dbPath; OutputStream dbOutput = new FileOutputStream(outFileName); try { byte[] buffer = new byte[1024]; int length; while ((length = dbInput.read(buffer)) > 0) { dbOutput.write(buffer, 0, length); } } finally { dbOutput.flush(); dbOutput.close(); dbInput.close(); } } } catch (Exception e) { e.toString(); } } private boolean doesDatabaseExist(ContextWrapper context, String dbName) { File dbFile = context.getDatabasePath(dbName); return dbFile.exists(); } } 
  2. Manifiesto: android: name = "com.myPackageName.MyAppStartClass"

  3. Asegúrese de crear un db vacío primero, si no obtiene un error de FileOutputStream () y dbPath = /data/data/com.myPackageName/databases/myDb.db

    SQLiteDatabase db = context.openOrCreateDatabase (consts.dbName, context.MODE_PRIVATE, null);

    Db.close ();

  4. Asegúrese de que su esquema db existente tiene una ID de columna de clave principal. ¡Oh si! Sugar sólo ve ID como clave principal para recuperar datos.

  5. Si desea utilizar las tablas existentes, NO especifique T cuando extienda SugarRecord Y usted tiene que agregar azúcar como un módulo y su proyecto depende de ello!

     public class Book extends SugarRecord { String title; String edition; public Book(){ } public Book(String title, String edition){ this.title = title; this.edition = edition; } } 

6.Si desea utilizar las tablas existentes. Tenga en cuenta que Sugar busca los nombres de las columnas MAYÚSCULAS, por lo que si sus nombres de columna de tabla existentes están en minúscula, nunca obtendrá ningún dato existente fuera de él.

7.That me lleva a una conclusión renuente: El azúcar es grande si su db del comienzo del rasguño y lo utiliza para generar el db y las tablas para usted. Pero no es así cuando ya ha tenido un db existente con datos en él.

Todavía no lo he probado. Sin embargo, si pudieras copiar el archivo de la base de datos a la ubicación de /data/data//db_name.db y usar la misma versión de db_name & db en la configuración de azúcar en manifiesto, debería recogerla.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.