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

时间:2016-02-12 07:29:14

标签: java c# android sqlite xamarin.android

我正在使用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);
        }
    }

2 个答案:

答案 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权限。