将 SQLite 数据库复制到 android 设备 C#

Copy SQLite database to an android device C#

我正在使用 Xamarin 构建应用程序并且我有一个现有的 SQLite 数据库,我想将其复制到设备上。问题是我找到的唯一示例代码在 Java 上,不知何故

Cannot implicitly convert type 'System.IO.Stream' to '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);
        }
    }

如果您想将数据库复制到设备上,我建议您将其放在资产文件夹中,然后您可以运行以下代码...

    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";
        });
    }
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 权限。