数据库不从资产复制
小生病只是粘贴我的代码希望有人会看到什么即时消息:
Database.Java
package gr.peos; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; public class Database extends SQLiteOpenHelper{ //The Android's default system path of your application database. private static String DB_PATH = "/data/data/gr.peos/databases/"; //Name of the Database to be created. private static String DB_NAME = "BLib"; private SQLiteDatabase myDataBase; private final Context myContext; /** * Constructor * Takes and keeps a reference of the passed context in order to access to the application assets and resources. * @param context */ public Database(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } /** * Creates a empty database on the system and rewrites it with your own database. * */ public void createDataBase() throws IOException{ //First we check if the database already exists, Method declared later boolean dbExist = checkDataBase(); if(dbExist){ //do nothing - database already exists }else{ //By calling this method an empty database will be created into the default system path //of your application so we are going to be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); //Method declared later } catch (IOException e) { throw new Error("Error copying database"); } } } /** * 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 transferring byte stream. * */ 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(); } //Opening the Database public void openDataBase() throws SQLException{ //Open the database String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } / //Finally overriding a few methods as required @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) { }
}
调用这个部分是在我的主要活动的onCreate方法(尝试别人也不是问题)。
Database myDbHelper = new Database(null); myDbHelper = new Database(this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { }catch(SQLException sqle){ throw sqle; }
现在怪异的部分。 在我的设备(我没有root访问权限,所以不能提取数据库后,它已被创build),我的数据似乎是48KB。 当在模拟器上运行完全相同的代码时,数据库不会被拷贝过来(我没有select任何exception)。 确切地说,android / metadata表似乎被复制,但其他表与数据arent。 有任何想法吗?
我给你完整的代码,如果你成功,请回复
public class DataBaseHelper extends SQLiteOpenHelper{ private Context mycontext; private String DB_PATH = "/data/data/gr.peos/databases/"; //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; private static String DB_NAME = "BLib.sqlite";//the extension may be .sqlite or .db public SQLiteDatabase myDataBase; /*private String DB_PATH = "/data/data/" + mycontext.getApplicationContext().getPackageName() + "/databases/";*/ public DataBaseHelper(Context context) throws IOException { super(context,DB_NAME,null,1); this.mycontext=context; boolean dbexist = checkdatabase(); if(dbexist) { //System.out.println("Database exists"); opendatabase(); } else { System.out.println("Database doesn't exist"); createdatabase(); } } 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"); } } } 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; } 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("/data/data/gr.peos/databases/BLib.sqlite"); // 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(); } 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(); }
如果你的文件名在资源文件夹中有扩展名必须添加在代码中。
喜欢
private static String DB_NAME = "BLib.extension";
扩展名就像“.sqlite”,“。db”等等