0

我有这段代码可以用我的 android 应用程序存储一个远程 sqlite .db 文件:

public String getRemoteCollection(String url, String dbName){
    BufferedInputStream in = null;
    FileOutputStream fout = null;
    dbName="myFile";
    try
    {
        in = new BufferedInputStream(new URL(url).openStream());
        fout = SectionManager.instance.activity.openFileOutput(dbName, Context.MODE_PRIVATE);

        byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1)
            fout.write(data, 0, count);
        if (in != null)
            in.close();
        if (fout != null)
            fout.close();                   
    }
    catch(Exception e){e.printStackTrace();}
    return dbName;
}

我需要用我的 sqlitemanager 打开那个文件,我有这个功能,它从资产中打开一个 .db 文件,但我需要调整这个方法来加载我在前面提到的方法中存储的文件,它不存储在资产上文件夹。所以我必须改变这个方法,但我不知道如何正确地做到这一点。

private void generateSQLiteDB(String databaseName) {     // 
        SQLiteDatabase db =  dbHelper.getReadableDatabase(); // by calling this line an empty database will be created into the default system path of this app - we will then overwrite this with the database from the server
        db.close();
        OutputStream os = null;
        InputStream is = null;
        try{
            is =  ctx.getAssets().open(databaseName+".db");
            String packageName=SectionManager.instance.activity.getApplicationContext().getPackageName();
            //os = new FileOutputStream("/data/data/com.android.launcher/databases/"+databaseName+".db");   
            os = new FileOutputStream("/data/data/"+packageName+"/databases/"+databaseName+".db");  
            copyFile(os, is);
        }catch (Exception e) {
            Log.e("DB", "Database not found", e);                          
        }finally{
            try{
                //Close the streams
                if(os != null)
                    os.close();
                if(is != null)
                    is.close();
            } catch (IOException e) {Log.e("DB", "Can't close adapters");}
        }
    }
4

1 回答 1

1

如文档所述,openFileOutput() 不采用路径,文件存储为应用程序“私有数据存储”的一部分,设备上的其他应用程序无法访问。因此,假设您上面的两个代码片段在同一个 Android 应用程序中,您无需担心路径,只需将相同的文件名传递给 openFileInput(),您将获得与存储相同的数据。

在您的情况下,您的文件名是 dbName,因此在您的第二个片段中:

is =  ctx.getAssets().open(databaseName+".db");

变成

is = ctx.openFileInput(databaseName);

在第一个片段中,它似乎被硬编码为“myFile”。我在这里假设 ctx 是 Context 类型或派生类,例如 Activity。

更新:如果您确实需要找出用于存储应用程序私有文件的文件系统目录,您可以调用:

ctx.getFilesDir();

或者

ctx.getFileStreamPath(databaseName);
于 2012-09-11T11:21:05.407 回答