【问题标题】:Cannot copy database from solution to local package folder on UWP无法将数据库从解决方案复制到 UWP 上的本地包文件夹
【发布时间】:2018-07-11 12:19:55
【问题描述】:

我在解决方案的 Databases 文件夹中有一个名为 tryout2.db 的数据库。如果本地包文件夹上没有这样的数据库,那么我想将它从解决方案中的 Databases 文件夹复制到本地包文件夹。 代码:

public ViewModel()
        {
            ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;

            if (!localSettings.Values.ContainsKey("defaultCategories"))
            {
                CopyDatabase();
                localSettings.Values["defaultCategories"] = true;
            }
            else
            {
                Categories();
            }
        }

        private async void CopyDatabase()
        {
            StorageFile dbFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Databases/tryout2.db"));
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            await dbFile.CopyAsync(localFolder);
            Categories();
        }

        public void Categories()
        {
            objConn = new SQLiteConnection("tryout2.db");
            string strQ = @"SELECT * FROM DBQUIZ;";
            var s = objConn.Prepare(strQ);

            while (s.Step() == SQLiteResult.ROW)
            {
                Items.Add(new DBQUIZ(s[0].ToString(), s[1].ToString(), s[2].ToString(), s[3].ToString(),
                    s[4].ToString()));
            }
        }

更新:使用检查文件是否存在:

SQLitePCL.SQLiteConnection objConn;
        public static string DB_PATH = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "tryout2.db"));//DataBase Name 

        public ViewModel()
        {
            if (!CheckFileExists("tryout2.db").Result)
            {
                using (var db = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DB_PATH))
                {
                    CopyDatabase();
                }
}
            else
            {
                CopyDatabase();
            }
        }

        private async Task<bool> CheckFileExists(string fileName)
        {
            try
            {
                var store = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
                return true;
            }
            catch
            {
            }
            return false;
        }

        public async void CopyDatabase()
        {
                StorageFile dbFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Databases/tryout2.db"));
                StorageFolder localFolder = ApplicationData.Current.LocalFolder;
                await dbFile.CopyAsync(localFolder);

            Categories();
        }

        public void Categories()
        {
            objConn = new SQLitePCL.SQLiteConnection("tryout2.db");
            string strQ = @"SELECT * FROM DBQUIZ;";
            var s = objConn.Prepare(strQ);

            while (s.Step() == SQLitePCL.SQLiteResult.ROW)
            {
                Items.Add(new DBQUIZ(s[0].ToString(), s[1].ToString(), s[2].ToString(), s[3].ToString(),
                    s[4].ToString()));
            }
        }

        public ObservableCollection<DBQUIZ> Items { get; private set; } = new ObservableCollection<DBQUIZ>();

我有一个问题,就是:每次我复制tryout.db时sizenya都是0 kb,表是空的。 如何处理?

【问题讨论】:

    标签: c# database sqlite uwp


    【解决方案1】:

    我没有评论的声誉,所以我必须写一个答案。

    您是否检查过数据库文件的属性?尝试将Build action 设置为Content,将Copy to Output Directory 设置为Copy always

    我已经尝试了您的代码,一切正常。

    【讨论】:

    • 是的,我已经将其设置为内容并复制alwat,如图:1drv.ms/i/s!Auqiv8Ukng7U9BZa_qKCeTQ2cz5e
    • 您是否尝试指定文件fxtension?因为目前您只将其命名为tryout2。可以设置成tryout2.db
    • 在我的示例中,您的代码有效。但我认为马丁是对的。你试过这个吗?
    • 我调试后发现问题:虽然本地包上不存在数据库,但是一直存在。所以在 if (!LocalSettings.Values.ContainsKey ("defaultCategories")) 中总是直接在 else 上运行。如何处理?
    • 您是否尝试卸载该应用程序?因为这是删除本地设置的唯一机制。
    【解决方案2】:

    CopyDatabase 调用发生在构造函数中,因此async 调用不能是awaited。您应该稍后进行初始化,可能在 OnNavigatedTo 事件处理程序中,以便您可以等待它们。

    目前,您可能会在数据库实际完成复制之前以某种方式访问​​数据库,这会导致复制失败。您不会得到异常,因为当不等待调用时,异常也会丢失。总的来说,不等待async 调用是一种不好的做法,因为你永远不会知道里面是否发生了不好的事情。

    【讨论】:

    • 你能给我一个样品吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多