将 SQLite 数据库从 sdcard 导入到 android - 没有资产文件夹

Posted

技术标签:

【中文标题】将 SQLite 数据库从 sdcard 导入到 android - 没有资产文件夹【英文标题】:Import SQLite database from sdcard to android - Without Assets Folder 【发布时间】:2016-11-04 07:44:12 【问题描述】:

我正在尝试将我的 sqlite 数据库从 sdcard 或任何外部位置导入我的 android 应用程序。我的应用程序需要数据库导入,这样数据库架构不会更改,但记录会根据导入的数据库而更改。

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

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

【问题讨论】:

检查这个 - ***.com/questions/9109438/… 所以这需要将数据库作为应用程序的一部分加载到 assets 文件夹中。我正在寻找独立于应用程序的东西。 @ShadabAnsari 【参考方案1】:

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

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<String> 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;

【讨论】:

能否请您提供整个代码 - 包括调用 DataBaseHelper 类的部分? @darush dary【参考方案2】:

我使用以下代码从 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();

另外,添加以下权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

【讨论】:

以上是关于将 SQLite 数据库从 sdcard 导入到 android - 没有资产文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

如何批量导入数据到Sqlite数据库

Android如何扫描sdcard中的音乐文件,并加载到ListView中?

以 SQLite 和 HDF5 格式从/导入到 numpy、scipy

将数据库从 PhPMyAdmin 导入到 Android

将 SQLite3 转储导入数据库