我正在构建一个Xamarin Cross平台应用程序。我希望我的应用程序从初始数据库开始。我如何创建我的sqlite数据库是否重要?我的意思是我可以使用一些SQlite浏览器应用程序创建它并期望它在Android,IOS和UWP中工作吗?我应该关心每个平台使用的sqlite版本吗?
答案 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
文件夹)。另外,请确保将ReadExternalStorage
和WriteExternalStorage
权限添加到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
中无法识别
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;
}
这是我的经验不是真正的答案,但也许我帮助了你,或者你可以帮助我;)谢谢你。