【发布时间】:2018-12-11 03:22:48
【问题描述】:
我正在用 SQLite DB 编写 uwp 程序。该程序使用一个通用的 Windows 库,该库包含一个控制 DB 的静态类。在异常堆栈跟踪中,我看到了 sqlite 的所有方法,即使它没有到达我在 DB Manager 类中放置的断点。
数据库建立的模型:
public class UserModel
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public bool Connected { get; set; }
}
静态数据库管理器:
public static class UsersManager
{
public static event EventHandler NewConnectionHandler=delegate { };
private static string _path;
private static SQLiteConnection _conn;
static UsersManager()
{
_path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "usersdb.sqlite");
_conn = new SQLiteConnection(new SQLitePlatformWinRT(), _path);
_conn.CreateTable<UserModel>();
}
private static void OnNewConnection()
{
NewConnectionHandler.Invoke(null, EventArgs.Empty);
}
public static void Add(UserModel user)
{
_conn.Insert(user);
}
public static void Delete(int userId)
{
_conn.Delete<UserModel>(userId);
}
public static bool Contains(string name)
{
bool flag = false;
var user = _conn.Find<UserModel>(u => u.Name == name);
if (user != null)
flag = true;
return flag;
}
public static void ConnectUser(UserModel connectedUser,HubConnection hubConnection ,IHubProxy hubProxy)
{
_conn.Find<UserModel>(connectedUser).Connected = true;
_conn.Update(connectedUser);
var queryStringData = new Dictionary<string, string>();
queryStringData.Add("username", connectedUser.Name);
hubConnection = new HubConnection("http://127.0.0.1:8080", queryStringData);
hubProxy = hubConnection.CreateHubProxy("ChatHub");
if (hubConnection.State != ConnectionState.Connected)
{
hubConnection.Start();
}
OnNewConnection();
}
public static ObservableCollection<UserModel> ConnectedUsers
{
get
{
var allUsers = _conn.Table<UserModel>();
ObservableCollection<UserModel> disconnectedUsers = new ObservableCollection<UserModel>();
ObservableCollection<UserModel> connectedUsers = new ObservableCollection<UserModel>();
foreach (var user in allUsers)
{
if (user.Connected)
connectedUsers.Add(user);
}
return connectedUsers;
}
}
public static ObservableCollection<UserModel> DisconnectedUsers
{
get
{
var allUsers = _conn.Table<UserModel>();
ObservableCollection<UserModel> disconnectedUsers = new ObservableCollection<UserModel>();
foreach (var user in allUsers)
{
if (!user.Connected)
disconnectedUsers.Add(user);
}
return disconnectedUsers;
}
}
}
异常发生的地方:
private void SignIn(object sender, RoutedEventArgs e)
{
if (userViewModel.SignIn()) //here right after trying execute SignIn()
{
Frame.Navigate(typeof(ContactsView), userViewModel);
}
}
UserViewModel 中的 SignIn 方法:
public bool SignIn()
{
bool flag = false;
if (Name == null || Password == null)
{
Error = "Name or password wasnt filled";
}
else if (UsersManager.Contains(Name) && !UserSettings.IsNameExict(Name))
{
Error = "Name already in use choose diffrent one";
}
else
{
UserModel user = new UserModel
{
Name = Name,
Password = Password,
};
if (!UsersManager.Contains(Name))
{
UsersManager.Add(user);
UserSettings.SaveUserName(Name);
}
UsersManager.ConnectUser(user,_hubConnection, _hubProxy);
flag = true;
}
return flag;
}
希望你们帮助我,我真的试图找到答案。谢谢
编辑 1:
今天再次运行程序,似乎是:程序在这个方法的UsersManager类中抛出异常:
public static void ConnectUser(UserModel connectedUser,HubConnection hubConnection ,IHubProxy hubProxy)
{
_conn.Find<UserModel>(connectedUser).Connected = true;//In this line!!!
_conn.Update(connectedUser);
var queryStringData = new Dictionary<string, string>();
queryStringData.Add("username", connectedUser.Name);
hubConnection = new HubConnection("http://127.0.0.1:8080", queryStringData);
hubProxy = hubConnection.CreateHubProxy("ChatHub");
if (hubConnection.State != ConnectionState.Connected)
{
hubConnection.Start();
}
OnNewConnection();
}
【问题讨论】:
-
错误是什么,
UserModels是什么样的?您可能需要简化代码以发布重现,这样做可能会为您解决问题。 -
@PeterTorr-MSFT 本文标题中指定的错误:System.NotSupportedException 无法存储类型:Library.Models.UserModel。 UserModel 看起来就像我将它放在第一个代码部分下的方式。并且代码很简单 MVVM 我将其全部发布。事实上,当我使用 UserModel 集合而不是 sqlite 时,代码正在运行。所以,我认为简化代码并不能解决错误。
标签: c# sqlite dll uwp windows-10-universal