我正在使用查询来查询我的Sqlite数据库,如下所示:
string noteSql = "select Column1, Column2 from [Diary.Notes]"
var notes = database.Query<object>(noteSql) as List<Object>;
其中Column1
是Int
而Column2
是String
但是当我的列表notes
被返回时,对象是不可读的。
我知道我可以创建一个具有Int
和String
类型属性的对象,它可以用于从[DiaryNotes]
返回的两个列,但我想要一个更通用的解决方案。< / p>
我试图制作如下通用类:
[Table("Table1")]
public class GenericSqliteObject : Object
{
public GenericSqliteObject()
{
}
private object _column1;
[Column("Column1")]
public object Column1
{
get { return _column1; }
set { _column1 = value; }
}
private object _column2;
[Column("Column2")]
public object Column2
{
get { return _column2; }
set { _column2 = value; }
}
}
但将行更改为:
var notes = database.Query<GenericSqliteObject>(noteSql) as List<GenericSqliteObject>;
继续返回错误:
{System.NotSupportedException:不知道如何阅读System.Object
在SQLite.Net.SQLiteCommand.ReadCol(IDbStatement stmt,Int32 index, ColType类型,System.Type clrType)[0x00827] in:0
在SQLite.Net.SQLiteCommand + d__15`1 [T] .MoveNext ()[0x00137] in:0
有没有办法从Sqlite查询返回一个通用对象,这样我就不必为不同的用例创建对象了?
PS。我在这里的例子已被简化以证明问题
答案 0 :(得分:0)
所以我的解决方案是将所有Column值保存为字符串并在运行时解析它们。
因此我的GenericSqliteObject
如下所示:
namespace FieldStrikeMove.PortableData.Helpers
{
[Table("Table1")]
public class GenericSqliteObject : Object
{
public GenericSqliteObject()
{
}
private string _column1;
[Column("Column1")]
public string Column1
{
get { return _column1; }
set { _column1 = value; }
}
private string _column2;
[Column("Column2")]
public string Column2
{
get { return _column2; }
set { _column2 = value; }
}
public int? GetInt(string column)
{
int rint;
if (Int32.TryParse(column, out rint))
return rint;
else
return null;
}
public long? GetLong(string column)
{
long rlong;
if (Int64.TryParse(column, out rlong))
return rlong;
else
return null;
}
public bool? GetBool(string column)
{
bool rbool;
if (Boolean.TryParse(column, out rbool))
return rbool;
else
return null;
}
public double? GetDouble(string column)
{
double rdouble;
if (Double.TryParse(column, out rdouble))
return rdouble;
else
return null;
}
public float? GetFloat(string column)
{
float rfloat;
if (float.TryParse(column, out rfloat))
return rfloat;
else
return null;
}
}
}
您可以为此添加任何额外的Get
方法