【问题标题】:Android - Could not open database in Xamarin.forms (SQLite exceptions)Android - 无法在 Xamarin.forms 中打开数据库(SQLite 异常)
【发布时间】:2016-06-22 22:02:06
【问题描述】:

对不起,如果之前有人问过这个问题,但我很好地搜索了这个问题,但我没有找到答案。

我在我的 Xamarin 表单项目 (PCL) 中使用 SQLite 处理本地数据库。

1- 连接在 iOS 中运行良好,但在 android 中我遇到了这个问题 (无法打开数据库文件)

  • 我还设置了“ReadExternalStorage”和“WriteExternalStorage”权限。

2- 我使用了另一种创建连接路径的方法:

string documentsPath = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal);
string path = Path.Combine(documentsPath, "pbcare.db");

这样处理数据库时发生异常...

        public bool checkLogin (string email, string password)
        {

            if (DB.Table<User> ().Where (user => user.Email == email && user.Password == password)
                            .FirstOrDefault () != null) { // exception caught here
                return true;
            } else {
                return false;
            }
        }

但该表在数据库中。

注意:即使数据库文件不存在,第二种方式也会创建连接!

【问题讨论】:

    标签: c# database sqlite xamarin xamarin.forms


    【解决方案1】:

    Android 将无法将 SQLite 数据库与本地系统中的文件一起使用。 path 变量必须来自 Android 系统。您用来创建路径的第二种方法是正确的:

    var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    path = Path.combine(path, 'pbcare.db3');
    

    将为 Android 上的 db3 文件创建适当的文件路径。

    您引用的下一个问题:no such table: User 是由于未创建表引起的。在使用数据库之前,您需要创建所有必要的表。

    var conn = new SQLiteConnection(path);
    conn.CreateTable<User>();
    

    如果您这样做并首先创建User 表,那么它应该可以按预期工作。这里有来自 Xamarin 的更深入的教程:https://developer.xamarin.com/guides/cross-platform/application_fundamentals/data/part_3_using_sqlite_orm/

    【讨论】:

    • 感谢@Dylan-s 的回复。所以我需要创建我需要在应用程序中使用的所有表,即使它已经在我的数据库中创建?我试过这个,它没有在我的数据库中创建任何东西。它也没有插入数据。就像数据库不存在一样。所以无论应用程序插入或创建它都不在我的数据库中!我不知道为什么!
    • @Ibrahim 您使用的是真实设备还是模拟器?您可以使用Android工具查看文件是否已创建?听起来好像没有写入数据库文件(我不确定为什么会发生这种情况)。
    • 有趣的是您的文件已创建,但 SQLiteConnection 无法找到任何插入的数据。您是否在尝试查询之前使用SQLiteConnection 插入数据(在第一个问题中使用 where)?关于多次创建表的观点:这有点用词不当。 CreateTable 将创建一个表,如果它不存在,或者什么都不做(如果它存在)。最好在打开连接时始终调用它。
    • db 文件将始终位于设备的文件系统中(无论是模拟器还是物理设备)。你不能为 SQLite 改变它。我不完全理解你的情况,但听起来你想要种子数据。换句话说,只要安装了应用程序,您的数据库就会预先填充数据。那是你要找的吗?否则,您可能希望在多个设备之间共享数据库(如果设备 1 插入了某些内容,然后您想在设备 2 上读取该内容),那么 SQLite 将不支持。
    • Xamarin 在这里讨论了这样一个过程:developer.xamarin.com/guides/cross-platform/…。在高层次上,您使用初始数据创建一个数据库文件,将其与您的应用程序一起打包,然后将其写入设备的文件系统(如果它不存在)以用作传递给SQLiteConnection 的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多