2011-01-22 20 views
5

Sto sviluppando una semplice applicazione Android con SQL. Ho seguito le seguenti guide - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/Impossibile aprire il database-Android

Viene visualizzato un errore quando si tenta di aprire il database. Ecco il mio DataBaseHelp.Java Aula

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) { 
    } 
} 

E questo è il mio testDB.Java Aula

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


     } 
    } 

ho creato il database utilizzando Browser SQLite database, creato una tabella denominata "birra", ha aggiunto 2 righe e metterlo nella cartella/assests nel mio progetto.

Si prega di notare che sono nuovo di SQL, ed è la mia prima volta che lo usa. Ho cercato tutto il giorno per una risposta e non sono riuscito a trovarne una.

Grazie!

+0

http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with -android-app/9109728 # 9109728 –

risposta

1

È necessario creare il database nel metodo onCreate del proprio helper del database (l'estensione di SQLiteOpenHelper). La chiamata a getReadableDatabase() non restituirà nulla finché non è stato creato un database nel contesto dell'applicazione.

db.execSQL("CREATE TABLE " + TABLE_NAME 
+ " (_id INTEGER PRIMARY KEY AUTOINCREMENT," 
+ "foo TEXT, bar TEXT);"); 

Qualcosa su quelle linee. Ovviamente compilare il proprio schema di dati.

Quindi è possibile leggere i dati dal database presente nella cartella delle risorse e inserirli nel database utilizzando i comandi sqlite.

Ecco un tutorial che ho usato per iniziare:

http://www.devx.com/wireless/Article/40842

+0

Ho bisogno di creare un database, anche se ne ho uno esterno (nelle risorse)? Ho la funzione copyDatabase() per farlo. – Tofira

+0

In createDataBase chiamate getReadableDatabase() se il database non esiste. Quella chiamata avrà esito negativo senza aver prima creato un database. – Lunchbox

+0

Chiamando getReadableDatabase() c'è stato un errore, l'ho cancellato. Ad ogni modo, copyDataBase() ha copiato il database dalle risorse per me. Non vedo come la creazione di un database aiuterà. Puoi spiegare per favore? – Tofira

0

suggerisco di usare un altro tutorial. Creare un database al di fuori dei dispositivi è "un po '" cablato. L'ho imparato da un libro, ma penso che questo tutorial usi la procedura giusta.

Edit: Ok, il tutorial è per un caso speciale

maggior parte di tutti gli esempi di Android e tutorial là fuori supporre che si desidera creare e popolare il database in fase di esecuzione e di non utilizzare e accedere a una database indipendente e precaricato con la tua applicazione Android.

Il metodo che sto per mostrare ti porta il tuo file di database SQLite dalla cartella "assets" e le copia nel percorso del database di sistema della tua applicazione in modo che l'API SQLiteDatabase possa aprirsi e accedervi normalmente.

3

aprire il database nel browser dei database SQLite e aggiungere una nuova tabella denominata "android_metadata",

è possibile eseguire la seguente istruzione SQL per farlo:

CREATE TABLE "android_metadata" ("locale "testo predefinito 'it_IT')

Ora inserire una singola riga con il testo 'en_US' nel "android_metadata" tavolo:

INSERT INTO "android_metadata" VALORI ('it_IT')

Quindi, è necessario rinominare il campo ID primario delle tabelle su "_id" in modo che Android possa sapere dove collegare il campo ID delle tabelle.

ora copiare il nuovo file di database nella cartella progetti attivi, funzionerà .....

Problemi correlati