1

我想在我的 Windows Store 应用程序中读取一个 sqlite 数据库,如果它存在的话......

通常要从数据库中读取表,我设置它所在的路径,然后调用 SQLiteConnection 函数......

问题是,为什么当我调用这样的简单函数时数据库不存在

public static async Task<ObservableCollection<Objects>> GetAll()
    {
        List<Objects> list;
        using (var db = new SQLiteConnection(dbPath))
        {
            // Activate Tracing
            db.Trace = true;

            list = (from p in db.Table<Objects>()
                            select p).ToList();

        }

创建数据库?

new SQLiteConnection(dbPath)调用时创建空数据库。可以在不创建连接的情况下打开连接吗?

4

2 回答 2

5

如果您查看正在使用的构造函数的代码-

public SQLiteConnection (string databasePath, bool storeDateTimeAsTicks = false)
            : this (databasePath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create, storeDateTimeAsTicks)
{
}

您会看到它传入了一个标志,指示 SQLite 如果数据库不存在则创建它。

为避免这种情况,只需使用另一个构造函数 -

public SQLiteConnection (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)

像这样 -

using (var db = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite))

请记住,如果数据库不存在,这将引发 SQLiteException。

另一种可能的解决方案是在打开之前手动检查文件是否存在。

于 2014-04-18T17:20:43.860 回答
0
public async Task<bool> IsDbExists(string fileName)
    {
        try
        {
            var item = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
            var db = new SQLiteConnection("Your db path");
            var tb1 = db.GetTableInfo("TableName1");
            var tb2 = db.GetTableInfo("TableName2");
            var tb3 = db.GetTableInfo("TableName3");
            var tb4 = db.GetTableInfo("TableName4");
            if (item == null || tb1.Count == 0 || tb2.Count == 0 || tb3.Count == 0 || tb4.Count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
    }
于 2015-02-27T01:56:22.913 回答