2016-01-08 2 views
0

Я пытаюсь скопировать уже существующую базу данных из моей папки с активами (Cultureheleper/mobile/src/main/assets/databases) в Систему, чтобы использовать ее в моем коде. Это мой DBHellper:Невозможно скопировать уже существующую базу данных

public class DatabaseCall extends SQLiteOpenHelper { 


private final static int DB_Version =1; 

private static String DB_PATH = "/data/data/de.gruppe8.culturehelper/databases/"; 
private final static String DB_Name = "DB.db"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 

/* private final static String tabelle1 = "Nutzer"; 

private final static String nutzer_id = "nutzer_id"; 
private final static String nutzer_name = "nutzer_Name"; 
private final static String nutzer_email = "nutzer_email";*/ 

public DatabaseCall(Context context){ 
    super(context,DB_Name,null,DB_Version); 
    Log.i("DB", "anfang gemacht"); 
    this.myContext = context; 
} 

public void createDataBase() throws IOException { 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 
     //By calling this method and empty database will be created into the default system path 
     //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 
      copyDataBase(); 
    } 

} 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
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; 
} 

/** 
* Copies your database from your local assets-folder to the just created empty database in the 
* system folder, from where it can be accessed and handled. 
* This is done by transfering bytestream. 
* */ 
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; 

     //myDataBase.close(); 

    //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() throws SQLException { 

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

} 
public void Anfrage(String Anfrage){ 
    /* String myPath = DB_PATH + DB_Name; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);*/ 
    Log.i("DB","bis hierhin hat alles funktioniert"); 
    myDataBase.execSQL(Anfrage); 

} 

} 

Это, как я называю это в OnCreate() из моего Mainactivity:

try { 
     DB.createDataBase(); 

    } catch (IOException ioe) { 
     throw new Error("Unable to create database"); 
    } 
    try { 

     DB.openDataBase(); 

    }catch(SQLException sqle){ 
     throw sqle; 
    } 

     DB.Anfrage("SELECT * FROM Ort;"); 

На первой установке я получаю эту ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{de.gruppe8.culturehelper/de.gruppe8.culturehelper.Phone}: android.database.sqlite.SQLiteException: no such table: Ort(Sqlite code 1): , while compiling: SELECT * FROM Ort;,(OS error - 2:No such file or directory) 


    Caused by: android.database.sqlite.SQLiteException: no such table: Ort(Sqlite code 1): , while compiling: SELECT * FROM Ort;,(OS error - 2:No such file or directory) 
in this Line: myDataBase.execSQL(Anfrage); 

На втором открытии я получаю следующее сообщение об ошибке:

java.lang.RuntimeException: Unable to start activity ComponentInfo{de.gruppe8.culturehelper/de.gruppe8.culturehelper.Phone}: android.database.sqlite.SQLiteException: unknown error(Sqlite code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only.,(OS error - 2:No such file or directory) 

Caused by: android.database.sqlite.SQLiteException: unknown error(Sqlite code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only.,(OS error - 2:No such file or directory) 
In this line:myDataBase.execSQL(Anfrage); 
+0

использования 'rawQuery' вместо' execSQL', документы говорят: '«» 'ExecSQL Выполнить один оператор SQL, который не является SELECT, или любой другой SQL-оператор, который возвращает данные '' '' – pskink

+0

привет, я не понял вопроса, который вам нужен, для нового файла Sqlite? –

+0

to pskink: я постараюсь. Ben_Gratvol, я пытаюсь скопировать уже существующую базу данных в свой проект, поэтому я могу использовать ее там. но это не сработает. – Halatira

ответ

0

либо использовать SQLiteDatabase#query или SQLiteDatabase#rawQuery как SQLiteDatabase#execSQL предназначен для:

Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data

Смежные вопросы