如何在Windows Phone 7上使用SQLite数据库?

3
我正在开发Windows Phone 7应用程序,对此技术不是很熟悉。在我的应用程序中,我使用了以下链接:http://wirebear.com/blog/2010/11/12/using-sqlite-in-your-wp7-app,并按照其中的步骤进行操作。但我遇到了Application.GetResourceStream()方法的问题。在这个方法中,我使用了以下代码:
Stream src = Application.GetResourceStream(
                 new Uri(@"/SQLiteConnectivity;component/" + dbName,
                     UriKind.Relative)).Stream;

我右键点击了我的项目名称,选择属性,并找到程序集名称为“SQLiteConnectivity”。运行应用程序后,我在Application.GetResourceStream()处遇到了空引用异常错误。我也不知道在Application.GetResourceStream()方法中应该使用什么代替'component'。您能否通过提供任何代码、链接或解决方案来帮助我解决上述问题?
是的,我已经得到了答案,如答案部分所述。我通过将数据库的“生成操作”设置为“资源”,并将“复制到输出目录”设置为“始终复制”,解决了上述问题。但现在我面临着新问题。
我在app.xaml.cs中声明了以下代码:
public partial class App : Application
{
    public PhoneApplicationFrame RootFrame { get; private set; }

    private DBHelper _db;
    public DBHelper db
    {
        get
        {
            if (_db == null)
                _db = new DBHelper("ExpenseManager.db");
            return _db;
        }
    }
}

我希望你能将其翻译为中文:在我的mainpage.xaml.cs中调用它,如下所示

private void button1_Click(object sender, RoutedEventArgs e)
{                
      // Code runs "for real"

    _customerEntries = (Application.Current as App).db.SelectObservableCollection<Category>("SELECT  Category_Name FROM Category WHERE Category_ID=1");
    textBox1.Text = _customerEntries.ToString();
}

我已经在mainpage类下面添加了一个类,如下所示。
public class Category
{
    public int Category_ID { get; set; }
    public string Category_Name { get; set; }
}

现在当我运行我的应用程序并点击按钮时,我会在SQLClient.cs的以下函数中收到“文件已加密或不在数据库中”的错误:BindAll(ppStmt)。
Sqlite3.Vdbe Prepare()
{
    Sqlite3.Vdbe ppStmt=new Sqlite3.Vdbe();
    if (Sqlite3.sqlite3_prepare_v2(_db, CommandText, CommandText.Length, ref ppStmt, 0) != Sqlite3.SQLITE_OK)
        throw new SQLiteException(Sqlite3.sqlite3_errmsg(_db));
    BindAll(ppStmt); 
    return ppStmt;
}

请问您能否提供任何代码或链接,以解决上述问题?如果我做错了什么,请指导我。


1
嗨,Shailesh,你能解决这个问题吗?我也遇到了同样的问题。有趣的是,在示例程序中附加了一个名为“Database.db”的文件,如果我删除此文件,则示例程序会出现与我面临的相同问题。请查看http://sviluppomobile.blogspot.com/2010/03/sqlite-for-wp-7-series-proof-of-concept.html。 - iamMobile
2个回答

1

您需要验证数据库文件的构建属性是否设置为资源,并检查dbName属性的值,以确保它是完整的文件名,包括任何文件夹结构。

应用程序的db属性需要进行不同的设置。请在您的App.xaml.cs文件中更改此行:

public DBHelper db = new DBHelper("DATABASE.s3db");

转换为:

private DBHelper _db;
public DBHelper db
{
  get 
  { 
    if (_db == null)
      _db = new DBHelper("DATABASE.s3db");
    return _db;
  }
}

请确保将 DATABASE.s3db 替换为你的数据库文件名称,包括文件夹结构。

针对错误:

'file is encrypted or is not in a database' 

你在哪个版本的SQLite中创建了这个数据库?你必须使用SQLite版本3。如果你正在使用SQLite3,那么你是否在这个数据库上设置了密码?

是的,数据库文件的构建属性设置为资源。此外,dbName没有文件夹结构。 - Shailesh Jaiswal
很高兴收到你的来信,说“如果你有任何问题,请告诉我”。感谢你的合作。我现在遇到了一个新问题。我已经编辑了我的问题,请指导我。 - Shailesh Jaiswal
我已经更新了答案,并添加了一些需要注意的事项。 - theChrisKent

0
我们可以像这样使用...
private void button1_Click(object sender, RoutedEventArgs e)
{                
  // Code runs "for real"


_customerEntries = (Application.Current as App).db.SelectObservableCollection<Category>("SELECT  Category_Name FROM Category WHERE Category_ID=1");
   foreach (Category me in _customerEntries )
     {
         fielddiscription.Add(me.field_description);//add to list
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接