Quiero usar preloaded database
en mi aplicación significa tratar de obtener la base de datos en el momento en que está instalado el apk para que pueda usar los datos ya guardados en eso. Copio el archivo "ingredients.db" en la carpeta de activos. Y utilizando un código siguiente, pero este consigue el error "Problema copia de base de datos Desde recurso de archivo"Cómo usar la base de datos SQLite precargada en Android desde Assets
¿Cómo puedo solucionar este problema? favor me sugieren las maneras posibles
Mi Clase auxiliar de base de datos es así
class IngredientHelper extends SQLiteOpenHelper {
private static final String DATABASE_PATH = "/data/data/com.example.preloadeddatabase/databases/";
private static final String DATABASE_NAME = "ingredients.db";
private static final String TABLE_NAME = "Ingredients";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_TITLE = "ingredient_name";
private static final int SCHEMA_VERSION = 1;
public SQLiteDatabase dbSqlite;
private final Context myContext;
public IngredientHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase() {
createDB();
}
public void createDB() {
boolean dbExist = DbExists();
if (!dbExist) {
this.getReadableDatabase();
copyDataBase();
}
}
private boolean DbExists() {
SQLiteDatabase db = null;
try {
String databasePath = DATABASE_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(databasePath, null,
SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
}
catch (SQLiteException e) {
Log.e("SqlHelper", "Database Not Found");
}
if (db != null) {
db.close();
}
return db != null ? true : false;
}
private void copyDataBase() {
InputStream iStream = null;
OutputStream oStream = null;
String outFilePath = DATABASE_PATH + DATABASE_NAME;
try {
iStream = myContext.getAssets().open(DATABASE_NAME);
oStream = new FileOutputStream(outFilePath);
byte[] buffer = new byte[2048];
int length;
while ((length = iStream.read(buffer)) > 0) {
oStream.write(buffer, 0, length);
}
oStream.flush();
oStream.close();
iStream.close();
}
catch (IOException e) {
throw new Error("Problem Copying Database From Resource File");
}
}
public void openDatabase() throws SQLException {
String myPath = DATABASE_PATH + DATABASE_NAME;
dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if (dbSqlite != null) {
dbSqlite.close();
}
super.close();
}
public Cursor getCursor() {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(TABLE_NAME);
String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE };
Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn,
null, null, null, null, "ingredient_name ASC");
return mCursor;
}
public String getName(Cursor c) {
return (c.getString(1));
}
@ Jazz-- dónde cambiar la extensión .db en la carpeta assets o en DATABASE_NAME –
no no, cuando está creando un archivo db desde el administrador sqlite, guárdelo como dbname.sqlite (predeterminado). No es necesario modificar – jazz