从资产文件夹中读取sqlite文件

我正在开发一个应用程序,我想从项目的资产文件夹中读取一个sqlite数据库文件。 我已经在网上search,但没有发现有帮助。 请帮帮我。 谢谢。

请使用SQLiteAssetHelper ,它具有您的应用程序第一次运行时需要安装预打包数据库的所有代码。

您不能直接从资产文件夹打开文件。 相反,您需要将资产文件夹的sqlite数据库复制到内部/外部存储中,然后使用文件path打开文件。 试一下下面的代码,从assests读取sqlite数据库,并将其复制到SD卡中使用它。

 public class DataBaseHelper extends SQLiteOpenHelper { private Context mycontext; private static String DB_NAME = "(datbasename).sqlite"; private static String DB_PATH ="/data/data/"+BuildConfig.APPLICATION_ID+"/databases/"; public SQLiteDatabase myDataBase; 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() { boolean checkdb = false; try { String myPath = DB_PATH + DB_NAME; File dbfile = new File(myPath); 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(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(); } 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(); } } 

基本上你可以得到一个文件名的InputStream(从AssetManager打开函数),并将其写入OutputStream。

 InputStream inputStream = getAssets().open(fileName); 

如果使用openOrCreateDatabase创build数据库,则可能需要将数据库置于数据库文件夹中。

  String fileName = "MySQLiteDB.db"; File file = getDatabasePath(fileName ); if (!file.exists()) { if (!file.getParentFile().exists()) { file.getParentFile().mkdir(); } InputStream inputStream = getAssets().open(DATABASE_NAME); OutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024 * 8]; int numOfBytesToRead; while((numOfBytesToRead = inputStream.read(buffer)) > 0) outputStream.write(buffer, 0, numOfBytesToRead); inputStream.close(); outputStream.close(); } db = SQLiteDatabase.openOrCreateDatabase(file, null); 
 1. Make the SQLite database file. If you don't have a sqlite manager I recommend you to download the opensource SQLite Database Browser available for Win/Linux/Mac. Make database file. 2. Use this database in your Android application. Now put your database file in the "assets" folder of your project and create a Database Helper class by extending the SQLiteOpenHelper class //Constructor public Databasehelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.myContext = context; } //Create a empty database on the system public void createDatabase() throws IOException { boolean dbExist = checkDataBase(); if(dbExist) { Log.v("DB Exists", "db exists"); // By calling this method here onUpgrade will be called on a // writeable database, but only if the version number has been // bumped //onUpgrade(myDataBase, DATABASE_VERSION_old, DATABASE_VERSION); } boolean dbExist1 = checkDataBase(); if(!dbExist1) { this.getReadableDatabase(); try { this.close(); copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } //Check database already exist or not private boolean checkDataBase() { boolean checkDB = false; try { String myPath = DATABASE_PATH + DATABASE_NAME; File dbfile = new File(myPath); checkDB = dbfile.exists(); } catch(SQLiteException e) { } return checkDB; } //Copies your database from your local assets-folder to the just created empty database in the system folder private void copyDataBase() throws IOException { String outFileName = DATABASE_PATH + DATABASE_NAME; OutputStream myOutput = new FileOutputStream(outFileName); InputStream myInput = myContext.getAssets().open(DATABASE_NAME); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myInput.close(); myOutput.flush(); myOutput.close(); } //delete database public void db_delete() { File file = new File(DATABASE_PATH + DATABASE_NAME); if(file.exists()) { file.delete(); System.out.println("delete database file."); } } //Open database public void openDatabase() throws SQLException { String myPath = DATABASE_PATH + DATABASE_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } public synchronized void closeDataBase()throws SQLException { if(myDataBase != null) myDataBase.close(); super.close(); } public void onCreate(SQLiteDatabase db) { } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { Log.v("Database Upgrade", "Database version higher than old."); db_delete(); } } 

//添加公共方法来插入,获取,删除和更新数据库中的数据。 }

在此处input代码

ReferLink: http : //androidtutorials60.blogspot.in/2013/03/1.html