从sdcard导入SQLite数据库到android – 没有Assets文件夹

我试图从sdcard或任何外部位置导入我的sqlite数据库到我的Android应用程序。 我的应用程序需要数据库导入,这样数据库模式不会更改,但记录会根据导入的数据库而更改。

(例如,我可能在给定时间导入具有10条记录的DatabaseA,而另一次我可能导入具有25条记录的DatabaseA。数据库A始终从同一外部位置导入)。

到目前为止我使用assets文件夹看到的导入方法没有帮助。 我想导入指向外部位置的数据库。

我使用以下代码从sdcard导入我的数据库。

请注意:需要在应用程序内创建一个数据库文件夹,以便成功导入数据库。

public void importDB() { String dir=Environment.getExternalStorageDirectory().getAbsolutePath(); File sd = new File(dir); File data = Environment.getDataDirectory(); FileChannel source = null; FileChannel destination = null; String backupDBPath = "/data/com.example.mine.move/databases/A.db"; String currentDBPath = "A.db"; File currentDB = new File(sd, currentDBPath); File backupDB = new File(data, backupDBPath); try { source = new FileInputStream(currentDB).getChannel(); destination = new FileOutputStream(backupDB).getChannel(); destination.transferFrom(source, 0, source.size()); source.close(); destination.close(); Toast.makeText(this, "Please wait", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } 

此外,添加以下权限。

  

如果导入不成功,请降级sdk版本或包含运行时权限。

从外部导入数据库| 内部目录:

 public class DataBaseHelper extends SQLiteOpenHelper { private static String DataBaseName = "dbname"; private static String DB_PATH = "" ; SQLiteDatabase database ; Context context ; public DataBaseHelper(Context context) { super(context, DataBaseName, null, 1); this.context =context ; String x = context.getDatabasePath("1").getPath() ; x = (String) x.subSequence(0 ,x.length()- 1); DB_PATH = x + DataBaseName ; if (checkExist()){ Log.e("DATA_BASE", " Exist"); }else{ try { createDataBase(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } boolean checkExist(){ boolean is = false ; try{ File file = new File(DB_PATH); if (file.exists()){ is= true ; } }catch (SQLiteException e){ Log.e("DATABESE_ERR" , e.getMessage() ) ; } return is ; } private void createDataBase() throws IOException{ if (checkExist()){ }else { getReadableDatabase() ; try{ copyDataBase(); }catch (IOException e){ Log.e("DATABASE-COPY-ERR", e.getMessage()); } } } private void copyDataBase()throws IOException { Uri fileUri = "your database file uri" ; File file = new File(fileUri.getPath()); FileInputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(DB_PATH); byte[] buffer = new byte[1024] ; int length =0 ; while( (length = inputStream.read(buffer) ) >0 ){ outputStream.write(buffer ,0 ,length); } outputStream.flush(); outputStream.close(); inputStream.close(); } public void openDataBase() throws SQLiteException{ database = SQLiteDatabase.openDatabase(DB_PATH ,null ,SQLiteDatabase.OPEN_READWRITE); } public void closeDataBase(){ if (database!= null){ database.close(); } try { super.clone() ; } catch (CloneNotSupportedException e) { e.printStackTrace(); } } 

}

如何使用这个类:

 public class DataBaseInterface { public DataBaseInterface(Context activity) { context = activity; } private void openDataBase() { try { dataBaseHelper = new DataBaseHelper(context); dataBaseHelper.openDataBase(); } catch (Exception e) { Log.e("DataBaseError", e.getMessage()); } } private void closeDataBase() { dataBaseHelper.close(); } } 

和查询数据库的示例方法:

 public ArrayList getSomeThing() { buffer = new ArrayList<>(); openDataBase(); query = "SELECT * FROM table_name"; cursor = dataBaseHelper.database.rawQuery(query, null); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToPosition(i); buffer.add(i, cursor.getString(0)); } closeDataBase(); cursor.close(); return buffer; }