No se puede abrir la base de datos-Android
Estoy desarrollando una sencilla aplicación de Android con SQL. He seguido las siguientes guías – http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
Tengo un error al intentar abrir la base de datos. Aquí está mi DataBaseHelp.Java Class-
- Cómo almacenar el objeto JSON en la base de datos SQLite
- Límites de la base de datos SQLite en Android
- ¿Cómo descargar el archivo de Google Drive con Drive.API?
- Actualizar consulta sqlite - Android
- ¿Cómo lograr límite de palabras en Sqlite Android?
public class DataBaseHelper extends SQLiteOpenHelper{ private static String DB_PATH = "/data/data/and.testDB/databases/"; private static String DB_NAME = "MyData"; private SQLiteDatabase myDataBase; private final Context myContext; public DataBaseHelper(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); if(dbExist){ //do nothing - database already exist }else{ this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try{ String myPath = DB_PATH + DB_NAME; 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; } private void copyDataBase() throws IOException{ //Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = DB_PATH + DB_NAME; //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(); } public void openDataBase() { //Open the database String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override public synchronized void close() { if(myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
Y este es mi testDB.Java clase-
public class testDB extends Activity { SQLiteDatabase myDataBase; public String[] gur = new String[4]; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DataBaseHelper myDbHelper = new DataBaseHelper(this); myDbHelper = new DataBaseHelper(this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { myDbHelper.openDataBase(); // Here is the problem-Can't open the database/ }catch(SQLException sqle){ throw sqle; } myDataBase = myDbHelper.getWritableDatabase(); Cursor c = myDataBase.rawQuery("SELECT * FROM beer", null); if (c != null ) { if (c.moveToFirst()) { for(int x=0;x< 1;x++) { gur[x] = (c.getString(c.getColumnIndex("name"))); c.moveToNext(); } } Toast.makeText(this,gur[0],Toast.LENGTH_LONG).show(); } } }
Creé la base de datos usando SQLite Database Browser, creé una tabla llamada "cerveza", añadí 2 filas y lo puse en la carpeta / assests en mi proyecto.
Tenga en cuenta que soy nuevo en SQL, y es la primera vez que lo uso. Busqué todo el día para una respuesta y no pude encontrar uno.
¡Gracias!
- Cómo encontrar el valor máximo de la columna en la base de datos sqlite
- Java.lang.StringIndexOutOfBoundsException: index = 0 length = 0 en obtener la base de datos sqlite
- Android, cómo ejecutar un archivo sql en sqlitedatabase
- Android: Cómo sumar todas las columnas de una base de datos SQLite y devolver 1 variable única
- Cómo obtener las cadenas de un cursor en Android?
- Uso de AND y OR en SQLite
- Carga perezosa de SQLite
- Android ExpandableListActivity y SimpleCursorTreeAdapter?
Abra su base de datos en el navegador de base de datos sqlite y agregue una nueva tabla llamada "android_metadata",
Puede ejecutar la siguiente instrucción SQL para hacerlo:
CREATE TABLE "android_metadata" ("locale" TEXTO DEFAULT 'en_US')
Ahora inserta una sola fila con el texto 'en_US' en la tabla "android_metadata":
INSERT INTO "android_metadata" VALUES ('en_US')
Entonces, es necesario cambiar el nombre del campo de identificación principal de sus tablas a "_id" por lo que Android sabrá dónde vincular el campo ID de sus tablas.
Ahora copia el nuevo archivo de base de datos en su carpeta de activos de proyectos, funcionará …..
Debe crear la base de datos en el método onCreate de su ayudante de base de datos (la extensión de SQLiteOpenHelper). Su llamada a getReadableDatabase () no devolverá nada hasta que se haya creado una base de datos en el contexto de la aplicación.
db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT," + "foo TEXT, bar TEXT);");
Algo en ese sentido. Obviamente llene su propio esquema de datos.
A continuación, puede leer los datos de la base de datos que tiene en su carpeta de activos e insertarlos en la base de datos utilizando los comandos sqlite.
He aquí un tutorial que utilizé para empezar:
Sugiero utilizar otro tutorial. Para crear una base de datos fuera de los dispositivos es "un poco" cableado. Lo aprendí de un libro, pero creo que este tutorial utiliza el procedimiento correcto.
Edit: Ok, el tutorial es para un caso especial
La mayoría de todos los ejemplos y tutoriales de Android que hay ahí asumen que desea crear y rellenar su base de datos en tiempo de ejecución y no utilizar y acceder a una base de datos independiente y precargada con su aplicación de Android.
El método que voy a mostrar toma su propio archivo de base de datos SQLite de la carpeta "assets" y copia en la ruta de acceso de la base de datos del sistema de su aplicación para que la API de SQLiteDatabase pueda abrirlo y acceder a él normalmente.