我正在使用Xamarin构建一个应用程序,我有一个现有的SQLite数据库,我想在设备上复制它。问题是我找到的唯一示例代码是在Java上,不知何故
无法将类型'System.IO.Stream'隐式转换为 '的java.io.InputStream'
这是我的代码
public void copyDataBase()
{
try
{
InputStream myInput = mContext.Assets.Open(DB_NAME);
string outputFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outputFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.Read(buffer, 0, 0)) > 0)
{
myOutput.Write(buffer, 0, length);
}
myOutput.Flush();
myOutput.Close();
myInput.Close();
}
catch (Exception e)
{
System.Console.WriteLine(e.Message);
}
}
答案 0 :(得分:1)
如果您要将数据库复制到设备上,我建议将其放在assets文件夹中,然后您可以运行以下代码...
public const string databaseName = "Sample.db";
public static async Task<string> DatabaseExists(Context context)
{
return await Task.Run(delegate
{
/**
this code is temporary
**/
string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "..", databaseName);
//File.Delete(dbPath);
// Check if your DB has already been extracted.
if (!File.Exists(dbPath))
{
using (BinaryReader br = new BinaryReader(context.Assets.Open(databaseName)))
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
{
byte[] buffer = new byte[2048];
int len = 0;
while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
{
bw.Write(buffer, 0, len);
}
bw.Close();
bw.Dispose();
}
br.Close();
br.Dispose();
return "success";
}
}
else
{
}
return "success";
});
}
答案 1 :(得分:0)
public void ExtractDB()
{
var szSqliteFilename = "databasename.db3";
var szSourcePath = new FileManager().GetLocalFilePath(szSqliteFilename);
var szDatabaseBackupPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/databasename_Backup.db3";
if (File.Exists(szSourcePath))
{
File.Copy(szSourcePath, szDatabaseBackupPath, true);
Toast.MakeText(this, "Copied", ToastLength.Short).Show();
}
}
获取Android设备存储的路径,如下所示
public class FileManager
{
public string GetLocalFilePath(string filename)
{
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
return Path.Combine(path, filename);
}
}
您需要在清单文件中添加android.permission.WRITE_EXTERNAL_STORAGE权限。