如何为跨平台使用准备Sqlite数据库

时间:2016-07-19 19:10:34

标签: sqlite xamarin

我正在构建一个Xamarin Cross平台应用程序。我希望我的应用程序从初始数据库开始。我如何创建我的sqlite数据库是否重要?我的意思是我可以使用一些SQlite浏览器应用程序创建它并期望它在Android,IOS和UWP中工作吗?我应该关心每个平台使用的sqlite版本吗?

2 个答案:

答案 0 :(得分:0)

在iOS上复制添加到Xamarin iOS项目根目录的数据库,在AppDelegate.FinsishedLaunching方法中运行此代码:

var dbPath = Path.Combine (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal), "yourdatabase.db3");
var appDir = NSBundle.MainBundle.ResourcePath;
var seedFile = Path.Combine(appDir, "yourdatabase.db3");
if (!File.Exists(dbPath) && File.Exists(seedFile))
{
    File.Copy(seedFile, dbPath);
}

对于Android,将数据库文件放在Raw文件夹中名为Resources的文件夹中(如果该文件夹不存在,则创建Raw文件夹)。另外,请确保将ReadExternalStorageWriteExternalStorage权限添加到AndroidManifest.xml文件中。然后在MainActivity.OnCreate方法中运行以下代码:

var dbPath = Path.Combine (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal), "yourdatabase.db3"); 
var readStream = Resources.OpenRawResource(Resource.Raw.yourdatabase);
if (!System.IO.File.Exists(dbPath)) {
    FileStream writeStream = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Write);
    ReadWriteStream(readStream, writeStream);
}

并将以下方法添加到MainActivity类:

private void ReadWriteStream(Stream readStream, Stream writeStream)
{
    int Length = 256;
    Byte[] buffer = new Byte[Length];
    int bytesRead = readStream.Read(buffer, 0, Length);
    // write the required bytes
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, Length);
    }
    readStream.Close();
    writeStream.Close();
}

然后,您将数据库文件放在dbPath变量路径的可写位置。请注意,此代码假定您只想复制db文件(如果该文件在可写位置尚不存在),这似乎是一个有效的假设。 :-)

答案 1 :(得分:0)

也许这个链接可以帮到你,

https://developer.xamarin.com/guides/xamarin-forms/working-with/databases/

请注意,此链接显示如何使用xamarin.Forms创建本地数据库,以获取dbpath,具体取决于每个平台。如果您使用的是mvvmcross,我建议您不要使用此解决方案。

我正在寻找一种方法来获取本地数据库路径,具体取决于每个平台而不使用xamarin.Forms,因为xamarin.Forms依赖于旧版本的android.support.v4 / v7,这在我的案例中是铅其他问题,例如无法安装下载缓存插件。

在同一个链接中,我提供了有关我正在尝试的信息,但该代码不适用于mvvmcross v4.4.0。在//winPhone中无法识别

ApplicationData.Current.LocalFolder.Path

string DatabasePath {
    get {
        var sqliteFilename = "TodoSQLite.db3";
        #if __IOS__
        string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
        string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder
        var path = Path.Combine(libraryPath, sqliteFilename);
        #else
        #if __ANDROID__
        string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
        var path = Path.Combine(documentsPath, sqliteFilename);
        #else
        // WinPhone
        var path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename);

        //TODO: Add Windows 8.1 and UWP cases here!
        // (use the PCL code above)

        #endif
        #endif
        return path;
    }

这是我的经验不是真正的答案,但也许我帮助了你,或者你可以帮助我;)谢谢你。