Xamarin.Android - SQLite ORM 查询挑战
Xamarin.Android - Challenge with SQLite ORM queries
我已经使用 Xamarin 几个星期了,我正在尝试寻找使用 SQLite ORM 的最佳实践 queries.I 有一个登录页面,该页面先启动,然后用户才能访问app.I 在第一个 activity 出现在屏幕之前创建数据库,并在 table 为 [=33= 时立即将管理员登录详细信息插入用户的 table ] 重点是,管理员要登录并导入一个 xml 文件,其中包含所有其他用户的个人信息 information.This 从文件中读取信息并保存到 sqlite。
接下来,其他用户可以在导入并保存他们的详细信息后登录 successfully.My 挑战是,在登录时,我想按如下方式验证详细信息:
1.Compare 输入的用户名和数据库中的单个用户名
**2.Check输入的密码,看是否与输入的用户名相符**
我目前正在使用 select 查询从数据库中提取所有密码,然后比较两个字符串(来自数据库和编辑文本字段)。但是如果它是一个大数据库,阅读所有数据将是相当 expensive.How 我要这样做吗?
如何同时查找该用户名的密码?
下面是我的代码:
namespace sample.NameSpace
{
[Activity (MainLauncher = true)]
public class MainActivity : Activity
{
Button login = FindViewById<Button> (Resource.Id.login);
try{
login.Click += (object sender, EventArgs e) => {
if (TextUtils.IsEmpty(userName.Text.ToString())) {
makeToast();
} else if (TextUtils.IsEmpty(password.Text.ToString())) {
makeToast();
} else {
returningUser = userName.Text.ToString().Trim();
returningUserPassword = password.Text.ToString().Trim();
}
//Check to see if the name is in the db already
List<string> allUsers = GetAllUserNames();
//Loop through the list of names and compare the retrieved username with the name entered in the text field
string retrievedDbName ="";
foreach(string name in allUsers )
{
retrievedDbName = name .Trim();
}
//Verify name
if(retrievedDbName .Equals(returningUser))
{
Toast.MakeText(this,
"Login Successful !", ToastLength.Short).Show();
Intent intent = new Intent (this, typeof(HomeActivity));
StartActivity (intent);
}
else
{
Toast.MakeText(this, "User Name or Password does not match", ToastLength.Short).Show();
}
};
} catch(Exception e){
logger.Exception (this, e);
}
public List<string>GetAllUserNames()
{
List<UserInfoTable> allUserNames = new List<UserInfoTable> ();
allUserNames = dataManager.GetSingleUserName ();
string name = "";
foreach(var UserName in allUserNames)
{
Console.WriteLine ("Usernames from db :" + name.ToString());
}
return allUserNames;
}
然后是DataManager class:
public List<UserInfoTable> GetSingleUserName()
{
UserInfoTable user = new UserInfoTable ();
using (var db = dbHandler.getUserDatabaseConnection ()) {
var userName = db.Query<UserInfoTable> ("select * from UserInfoTable where user_name = ?", user.USER_NAME);
return userName;
}
}
public bool CheckLogin(string user, string password)
{
bool valid = false;
using (var db = dbHandler.getUserDatabaseConnection ()) {
var user = db.Query<UserInfoTable> ("select * from UserInfoTable where user_name = ? and password = ?", user, password);
if (user != null) valid = true;
}
return valid;
}
我已经使用 Xamarin 几个星期了,我正在尝试寻找使用 SQLite ORM 的最佳实践 queries.I 有一个登录页面,该页面先启动,然后用户才能访问app.I 在第一个 activity 出现在屏幕之前创建数据库,并在 table 为 [=33= 时立即将管理员登录详细信息插入用户的 table ] 重点是,管理员要登录并导入一个 xml 文件,其中包含所有其他用户的个人信息 information.This 从文件中读取信息并保存到 sqlite。
接下来,其他用户可以在导入并保存他们的详细信息后登录 successfully.My 挑战是,在登录时,我想按如下方式验证详细信息:
1.Compare 输入的用户名和数据库中的单个用户名
**2.Check输入的密码,看是否与输入的用户名相符**
我目前正在使用 select 查询从数据库中提取所有密码,然后比较两个字符串(来自数据库和编辑文本字段)。但是如果它是一个大数据库,阅读所有数据将是相当 expensive.How 我要这样做吗?
如何同时查找该用户名的密码?
下面是我的代码:
namespace sample.NameSpace
{
[Activity (MainLauncher = true)]
public class MainActivity : Activity
{
Button login = FindViewById<Button> (Resource.Id.login);
try{
login.Click += (object sender, EventArgs e) => {
if (TextUtils.IsEmpty(userName.Text.ToString())) {
makeToast();
} else if (TextUtils.IsEmpty(password.Text.ToString())) {
makeToast();
} else {
returningUser = userName.Text.ToString().Trim();
returningUserPassword = password.Text.ToString().Trim();
}
//Check to see if the name is in the db already
List<string> allUsers = GetAllUserNames();
//Loop through the list of names and compare the retrieved username with the name entered in the text field
string retrievedDbName ="";
foreach(string name in allUsers )
{
retrievedDbName = name .Trim();
}
//Verify name
if(retrievedDbName .Equals(returningUser))
{
Toast.MakeText(this,
"Login Successful !", ToastLength.Short).Show();
Intent intent = new Intent (this, typeof(HomeActivity));
StartActivity (intent);
}
else
{
Toast.MakeText(this, "User Name or Password does not match", ToastLength.Short).Show();
}
};
} catch(Exception e){
logger.Exception (this, e);
}
public List<string>GetAllUserNames()
{
List<UserInfoTable> allUserNames = new List<UserInfoTable> ();
allUserNames = dataManager.GetSingleUserName ();
string name = "";
foreach(var UserName in allUserNames)
{
Console.WriteLine ("Usernames from db :" + name.ToString());
}
return allUserNames;
}
然后是DataManager class:
public List<UserInfoTable> GetSingleUserName()
{
UserInfoTable user = new UserInfoTable ();
using (var db = dbHandler.getUserDatabaseConnection ()) {
var userName = db.Query<UserInfoTable> ("select * from UserInfoTable where user_name = ?", user.USER_NAME);
return userName;
}
}
public bool CheckLogin(string user, string password)
{
bool valid = false;
using (var db = dbHandler.getUserDatabaseConnection ()) {
var user = db.Query<UserInfoTable> ("select * from UserInfoTable where user_name = ? and password = ?", user, password);
if (user != null) valid = true;
}
return valid;
}