So hier mal meine Sqlite Klasse die aus den Assets die DB nimmt und in den internene speicher kopiert.
Der Update Teil und der Abgleich mit der bestehenden Tabelle fehlt hier, da ich die DB aus der App über eine Webschnittstelle zusätzlich aktualisieren kann. Das ganze ist also nur für den ersten Start erstellt, damit die DB dda nicht komplett leer ist.
(Zudem habe ich die DB mit dem Tool SqLiteDAtaBaseBrowser erstellt)
public class DataBaseHelper extends SQLiteOpenHelper {
private Context mycontext;
private String DB_PATH;
private static String DB_NAME = "deineDB.db";//the extension may be .sqlite or .db
public SQLiteDatabase myDataBase;
private static DataBaseHelper _instance;
/**
* Prüft auf schon existierende Instanz (Singleton variante, bei mehrerend DBs bitte weglassen)
* @param ctx
* @return
*/
public static DataBaseHelper getInstance(Context ctx)
{
if(_instance != null) return _instance;
return new DataBaseHelper(ctx);
}
/**
* Erstellt eine neue Instanz und wenn DB nicht existiert, wird eine aus den Assets kopiert
* @param context
*/
public DataBaseHelper(Context context) {
super(context,DB_NAME,null,1);//Wobei die 1 hier für den Versionscode steht, welchen man bei einem Update erhähen kann (musst du halt dann anpassen)
this.mycontext=context;
DB_PATH = "/data/data/"+ mycontext.getPackageName()+"/databases/";
_instance = this;
boolean dbexist = checkdatabase();
if (dbexist) {
//System.out.println("Database exists");
opendatabase();
} else {
System.out.println("Database doesn't exist");
try {
createdatabase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
opendatabase();
}
}
/**
* Datenbank erstellen
* @throws IOException
*/
public void createdatabase() throws IOException {
boolean dbexist = checkdatabase();
if(dbexist) {
//System.out.println(" Database exists.");
} else {
this.getReadableDatabase();
try {
copydatabase();
} catch(IOException e) {
throw new Error("Error copying database" + e.toString());
}
}
}
/**
* Auf existierende Datenbank prüfen
* @return
*/
private boolean checkdatabase() {
//SQLiteDatabase checkdb = null;
boolean checkdb = false;
try {
String myPath = DB_PATH + DB_NAME;
File dbfile = new File(myPath);
//checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
checkdb = dbfile.exists();
} catch(SQLiteException e) {
System.out.println("Database doesn't exist");
}
return checkdb;
}
/**
* Datenbank aus den assets in den Internen Speicher Kopieren
* @throws IOException
*/
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 byte to inputfile to 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();
}
/**
* Öffnet die Datenbank
* @throws SQLException
*/
public void opendatabase() throws SQLException {
//Open the database
String mypath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
}
public synchronized void close() {
if(myDataBase != null) {
myDataBase.close();
}
super.close();
}
/**
* Erstellt DB SQL abfrage fürs erstellen (nicht nötig wenn du eine existierende DB mit Daten kopierst)
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String query = "CREATE TABLE `test` ("+
"`_id` INTEGER,"+
"`field1` text,"+
"`int1` int,"+
"`title` text,"+
"`name` text,"+
"`desc` text,"+
"PRIMARY KEY(_id)"+
");";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Udate Dinge hier rein. Wei man das dan allerding mit Versionscode o.ä. benutzt müsstest du nochmal nachlesen
}
}
— geändert am 31.08.2015, 22:24:31
LG Pascal //It's not a bug, it's a feature.