sqlite-net-pcl 查询返回正确的行数,但所有数据为空或 0

问题描述

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

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

我有一个现有的非空 db (textdb.db ):

我在网上搜索,发现有几个人抱怨相同的结果,但我找不到解决方案。

我希望外面的人会看到一些东西并告诉我哪里出了问题。

结构: 表:测试表 …………………… id,INT,主键 数据,BIGINT

数据 编号 = 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;
    }
}

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

解决方法

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

0 我正在 Models 文件夹中创建一个类

namespace MyApp.Models
{
   public class testtable
     {
      public int id { get; set; }
      public int data {get; set; }
     }
}

1 在 MainActivity.cs (Android) 中

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        
        string dbName = "your_table_name.db3";
        string folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        string dbPath = Path.Combine(folderPath,dbName);
        LoadApplication(new App(dbPath));
    }

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();
    }