C# sqlite net pcl查询返回正确的行计数,但所有数据均为null或0

C# sqlite net pcl查询返回正确的行计数,但所有数据均为null或0,c#,xamarin,sqlite-net-pcl,C#,Xamarin,Sqlite Net Pcl,请帮忙。 我正在努力学习xamarin c-sharp。为此,我学到了足够多的基础知识,我有信心尝试制作一个简单的SQLite Db应用程序 我正在使用sqlite net pcl。我试过Xamarin.Android和Xamarin.Forms。我已经在两台不同的win10计算机上运行了该应用程序。我已经在模拟器和手机上运行了该应用程序。所有的结果都是一样的。所有返回的数据均为0或null 我有一个非空的数据库(textdb.db ): 我在网上搜索了一下,发现有几个人抱怨同样的结果,但我找不

请帮忙。 我正在努力学习xamarin c-sharp。为此,我学到了足够多的基础知识,我有信心尝试制作一个简单的SQLite Db应用程序

我正在使用sqlite net pcl。我试过Xamarin.Android和Xamarin.Forms。我已经在两台不同的win10计算机上运行了该应用程序。我已经在模拟器和手机上运行了该应用程序。所有的结果都是一样的。所有返回的数据均为0或null

我有一个非空的数据库(textdb.db ):

我在网上搜索了一下,发现有几个人抱怨同样的结果,但我找不到解决办法

我希望外面有人能看到一些东西,告诉我出了什么问题

结构: 表:testtable ................... id,INT,主键 数据,BIGINT

资料 id=1 数据=2

我的代码:

using System;
using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Views;
using AndroidX.AppCompat.Widget;
using AndroidX.AppCompat.App;
using Google.Android.Material.FloatingActionButton;
using Google.Android.Material.Snackbar;
using Android.Widget;
using System.IO;
using SQLite;
using System.Linq;

namespace android_db_app
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
        . . .
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
        . . .
        }

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
        . . .
        }

        private void FabOnClick(object sender, EventArgs eventArgs)
        {
        . . .
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
        . . .
       }

        public void Exit_Click(object sender, EventArgs e)
        {
            System.Environment.Exit(0);
        }

        public void Connect_Click(object sender, EventArgs e)
        {
            object o,o1;
            string dbname = "test.db";
            string s = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, @"DailyReminder/DB/" + dbname);
            if (!File.Exists(s))
                s = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, dbname);
            SQLiteAsyncConnection dbConnection = new SQLiteAsyncConnection(s);//SQLiteConnection.Table
            string sql = "SELECT * FROM testtable;";
            string sql1 = "SELECT ID FROM testtable;";
            o = dbConnection.Table<testtable>();
            o1 =  dbConnection.QueryAsync<int>(sql1,0);
        }
    }

    public class testtable
    {
        public Int32 id;
        public Int64 data;
    }
}
使用系统;
使用Android.App;
使用Android.OS;
使用Android.Runtime;
使用Android.Views;
使用AndroidX.AppCompat.Widget;
使用AndroidX.AppCompat.App;
使用Google.Android.Material.FloatingActionButton;
使用Google.Android.Material.Snackbar;
使用Android.Widget;
使用System.IO;
使用SQLite;
使用System.Linq;
名称空间android_db_应用程序
{
[活动(Label=“@string/app_name”,Theme=“@style/AppTheme.NoActionBar”,MainLauncher=true)]
公共类MainActivity:AppCompativeActivity
{
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
. . .
}
公共覆盖布尔onCreateOptions菜单(IMenu菜单)
{
. . .
}
公共覆盖bool OnOptionsItemSelected(IMenuItem)
{
. . .
}
私有void FabOnClick(对象发送方,EventArgs EventArgs)
{
. . .
}
public override void OnRequestPermissionsResult(int-requestCode,string[]permissions,[GeneratedEnum]Android.Content.PM.Permission[]grantResults)
{
. . .
}
公共无效退出\u单击(对象发送者,事件参数e)
{
系统环境退出(0);
}
public void Connect\u单击(对象发送方,事件参数e)
{
对象o,o1;
字符串dbname=“test.db”;
字符串s=Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path,@“dailryreminder/DB/”+dbname);
如果(!File.Exists))
s=Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path,dbname);
SQLiteAsyncConnection dbConnection=新的SQLiteAsyncConnection;//SQLiteConnection.Table
string sql=“SELECT*fromtesttable;”;
string sql1=“从testtable中选择ID;”;
o=dbConnection.Table();
o1=dbConnection.QueryAsync(sql1,0);
}
}
公共类测试表
{
公共Int32 id;
公共Int64数据;
}
}

对象中的所有结果都是值0,而不是1和2。

对于我的sqlite.net,这是我的设置:

0我正在“模型”文件夹中创建一个类

namespace MyApp.Models
{
   public class testtable
     {
      public int id { get; set; }
      public int data {get; set; }
     }
}
1.MainActivity.cs内部(Android)

2在App.xaml.cs中:

    public static string DatabasePath = string.Empty; //sqlite

    public App(string databasePath)
    {
        InitializeComponent();

        MainPage = new NavigationPage(new View.MainPage());

        DatabasePath = databasePath; //sqlite
    }
3调用数据库,例如,您希望在页面出现时调用数据库:

    using MyApp.Models;
    ...
    protected override async void OnAppearing()
    {
         using SQLiteConnection conn = new SQLiteConnection(App.DatabasePath);
         conn.CreateTable<testtable>();
         List<testtable> notes = conn.Table<testtable>().ToList();
    }
使用MyApp.Models;
...
受保护的重写异步void OnAppearing()
{
使用SQLiteConnection conn=newsqliteconnection(App.DatabasePath);
conn.CreateTable();
列表注释=conn.Table().ToList();
}

首先,在不使用wait的情况下进行异步db调用。第二,您应该真正使用库的ORM功能,而不是试图编写原始SQL查询。您可以从这里或这里了解更多关于sqlite net pcl的信息:谢谢。不幸的是,conn.CreateTable();抛出错误系统。异常:“无法创建没有列的表(“android\u db\u app.testtable”是否具有公共属性?)”我想我会尝试下载您提供的链接中提供的示例。错误说明,db列必须是公共属性。你的是公共领域,而不是财产杰森的答案是正确的。谢谢。对不起,我忘了申报单了,我要添加我的模型申报单
    using MyApp.Models;
    ...
    protected override async void OnAppearing()
    {
         using SQLiteConnection conn = new SQLiteConnection(App.DatabasePath);
         conn.CreateTable<testtable>();
         List<testtable> notes = conn.Table<testtable>().ToList();
    }