我一直在努力寻找一种在Win IoT下的Pi上保存SQLite数据库的方法,可以由不同的后台应用程序(不是同时)访问。
当我发现图书馆(音乐,图片,视频 - 但不恰当的不是文档,没有更多工作)时,我以为我得到了答案。我可以在一个应用程序中创建一个文本文件,并将其写入图片库的默认文件夹。然后我可以用另一个应用程序读取文本文件。 File.Exists返回true。宾果(我想)!
但是,SQLite不会在文件夹中创建数据库或打开我复制到该文件夹的现有数据库。 SQLite.Net.SQLiteConnection返回一个SQLite异常:"无法打开数据库文件:C:\ Data \ Users \ DefaultAccount \ Pictures \ MyDb.db(CannotOpen)" - 没有进一步的线索。
该文件夹似乎授予完全权限。有人有什么想法吗?
创建和编写文本文件:
using System;
using Windows.ApplicationModel.Background;
using System.IO;
using System.Diagnostics;
//*** NOTE: Pictures Library checked in Package.appxmanifest 'Capabilities'
namespace LibraryTest
{
public sealed class StartupTask : IBackgroundTask
{
private BackgroundTaskDeferral Deferral;
public async void Run (IBackgroundTaskInstance taskInstance)
{
Deferral = taskInstance.GetDeferral ();
var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync
(Windows.Storage.KnownLibraryId.Pictures);
string path = myPictures.SaveFolder.Path;
Debug.WriteLine ($"'Pictures' Folder: {path}");
string newFilePath = Path.Combine (path, "TestTextFile.txt");
Debug.WriteLine ($"New File Path: {newFilePath}");
try {
using ( var stream = File.OpenWrite (newFilePath) ) {
using ( var writer = new StreamWriter (stream) ) {
writer.Write ("This is some test text.");
}
}
Debug.WriteLine ($"File created OK");
}
catch (Exception ex) { Debug.WriteLine ($"Exception: {ex.Message}"); }
}
}
}
制作人:
'Pictures' Folder: C:\Data\Users\DefaultAccount\Pictures
New File Path: C:\Data\Users\DefaultAccount\Pictures\TestTextFile.txt
File created OK
读:
using System;
using Windows.ApplicationModel.Background;
using System.IO;
using System.Diagnostics;
//*** NOTE: Pictures Library checked in Package.appxmanifest 'Capabilities'
namespace ReadLibraryTest
{
public sealed class StartupTask : IBackgroundTask
{
private BackgroundTaskDeferral Deferral;
public async void Run (IBackgroundTaskInstance taskInstance)
{
Deferral = taskInstance.GetDeferral ();
var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync
(Windows.Storage.KnownLibraryId.Pictures);
string path = myPictures.SaveFolder.Path;
Debug.WriteLine ($"'Pictures' Folder: {path}");
string newFilePath = Path.Combine (path, "TestTextFile.txt");
Debug.WriteLine ($"New File Path: {newFilePath}");
try {
using ( var stream = File.OpenRead (newFilePath) ) {
using ( var reader = new StreamReader (stream) ) {
string fileContents = reader.ReadLine ();
Debug.WriteLine ($"First line of file: '{fileContents}'");
}
}
Debug.WriteLine ($"File read OK");
}
catch ( Exception ex ) { Debug.WriteLine ($"Exception: {ex.Message}"); }
}
}
}
制作人:
'Pictures' Folder: C:\Data\Users\DefaultAccount\Pictures
New File Path: C:\Data\Users\DefaultAccount\Pictures\TestTextFile.txt
First line of file: 'This is some test text.'
File read OK
答案 0 :(得分:2)
但是,SQLite不会在文件夹中创建数据库或打开 我复制到该文件夹的现有数据库。 SQLite.Net.SQLiteConnection返回一个SQLite异常:"无法 打开数据库文件:C:\ Data \ Users \ DefaultAccount \ Pictures \ MyDb.db (CannotOpen)" - 没有进一步的线索。
是的,我转载了这个问题。看来这个文件夹不适用于SQLite文件操作,但我不知道问题出在哪里。
作为解决方法,您可以使用PublisherCacheFolder。我创建.db文件并在一个后台应用程序中写入数据。并从另一个后台应用程序中读取数据。有用。
联系班级:
backgroundColor
创建并编写文件:
public sealed class Contact
{
public int Id { get; set; }
public string Name { get; set; }
}
读取文件:
StorageFolder sharedFonts = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("test");
var sqlpath = System.IO.Path.Combine(sharedFonts.Path, "MyDb.db");
using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqlpath))
{
conn.CreateTable<Contact>();
for (var i = 0; i < 100; i++)
{
Contact contact = new Contact()
{
Id = i,
Name = "A"
};
conn.Insert(contact);
}
}
要使用此发布商文件夹,您需要在Package.appxmanifest中添加以下行:
StorageFolder sharedFonts = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("test");
var sqlpath = System.IO.Path.Combine(sharedFonts.Path, "MyDb.db");
using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqlpath))
{
var query = conn.Table<Contact>().Where(v => v.Name.Equals("A"));
foreach (var stock in query)
Debug.WriteLine("contact: " + stock.Id);
}
答案 1 :(得分:0)
谢谢,丽塔。工作得很好。为了所有人阅读的好处,我使用的是SqlLite的异步版本,并按如下方式创建连接:
class
然后,例如,阅读Parms:
类型的表>>> class Foo(object):
__bar = None
def set_bar(self, v):
self.__bar = v
>>> f = Foo()
>>> f.set_bar(42)
>>> f.__dict__
{'_Foo__bar': 42}
我对SQLite异步连接的担心是它不是IDisposable。因此,&#39;工厂&#39;最终耗尽蒸汽(记忆,手柄)?但我想这是另一个主题的主题。