C# sqlite net pcl查询返回正确的行计数,但所有数据均为null或0
请帮忙。 我正在努力学习xamarin c-sharp。为此,我学到了足够多的基础知识,我有信心尝试制作一个简单的SQLite Db应用程序 我正在使用sqlite net pcl。我试过Xamarin.Android和Xamarin.Forms。我已经在两台不同的win10计算机上运行了该应用程序。我已经在模拟器和手机上运行了该应用程序。所有的结果都是一样的。所有返回的数据均为0或null 我有一个非空的数据库(textdb.db ): 我在网上搜索了一下,发现有几个人抱怨同样的结果,但我找不到解决办法 我希望外面有人能看到一些东西,告诉我出了什么问题 结构: 表:testtable ................... id,INT,主键 数据,BIGINT 资料 id=1 数据=2 我的代码: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 ): 我在网上搜索了一下,发现有几个人抱怨同样的结果,但我找不
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();
}