Cli*_*ger 5 sqlite xamarin.ios ios xamarin
我正在使用mac上的xamarin studio为ios创建一个简单的sqlite驱动的应用程序.
sqlite文件是在"个人"文件夹中创建的,并且在构建之间保留,但是当我运行应用程序时,我在上一个调试会话中创建的表格消失了吗?
在我的代码中,在检查文件是否存在之后,我使用sqliteconnection连接并创建一个表,并从命令对象中插入一个带有executenonquery方法的行.虽然在相同的上下文中我可以使用第二个命令对象查询表,但如果我停止调试器并重新启动表,我走了?
我应该将文件放在不同的文件夹中,是用xamarin还是ios设置来保存表格?我无意中在sqlite中使用临时表或可能是什么问题?
注意:到目前为止,我只使用xamarin的启动版本并在iphone模拟器上进行调试.
public class BaseHandler
{
private static bool DbIsUpToDate { get; set; }
const int DB_VERSION = 1; //Created DB
const string DB_NAME = "mydb.db3";
protected const string CNN_STRING = "Data Source=" + DB_NAME + ";Version=3";
public BaseHandler ()
{
//No need to validate database more than once on each restart.
if (DbIsUpToDate)
return;
CheckAndCreateDatabase(DB_NAME);
int userVersion = GetUserVersion();
UpdateDBToVersion(userVersion);
DbIsUpToDate = true;
}
int GetUserVersion()
{
int version = 0;
using (var cnn = new SqliteConnection(CNN_STRING))
{
cnn.Open();
using (var cmd = cnn.CreateCommand())
{
cmd.CommandText = "CREATE TABLE UVERSION (VERSION INTEGER);" +
"INSERT INTO UVERSION (VERSION) VALUES(1);";
cmd.ExecuteNonQuery();
}
using (var cmd = cnn.CreateCommand())
{
cmd.CommandText = "SELECT VERSION FROM UVERSION;";
var pragma = cmd.ExecuteScalar();
version = Convert.ToInt32((long)pragma);
}
}
return version;
}
void UpdateDBToVersion(int userVersion)
{
//Prepare the sql statements depending on the users current verion
var sqls = new List<string> ();
if (userVersion < 1)
{
sqls.Add("CREATE TABLE IF NOT EXISTS MYTABLE ("
+ " ID INTEGER PRIMARY KEY, "
+ " NAME TEXT, "
+ " DESC TEXT "
+ ");");
}
//Execute the update statements
using (var cnn = new SqliteConnection(CNN_STRING))
{
cnn.Open();
using (var trans = cnn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
foreach(string sql in sqls)
{
using (var cmd = cnn.CreateCommand())
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
trans.Commit();
//SetUserVersion(DB_VERSION);
}
}
}
protected string GetDBPath (string dbName)
{
// get a reference to the documents folder
var documents = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
// create the db path
string db = Path.Combine (documents, dbName);
return db;
}
protected void CheckAndCreateDatabase (string dbName)
{
var dbPath = GetDBPath(dbName);
// determine whether or not the database exists
bool dbExists = File.Exists(dbPath);
if (!dbExists)
SqliteConnection.CreateFile(dbPath);
}
}
Run Code Online (Sandbox Code Playgroud)
同样,我的问题是,每次运行调试器时,它都会运行GetUserVersion,但会话之间的表UVERSION不会持久存在."File.Exists(dbPath)"返回true,因此不运行CreateFile.为什么db是空的?
这是我用来在iOS模拟器中保存我的数据库的代码片段,数据似乎在app编译之间保持不变:
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
string libraryPath = Path.Combine (documentsPath, "../Library/");
var path = Path.Combine (libraryPath, "MyDatabase.db3");
Run Code Online (Sandbox Code Playgroud)
您可能还想查看Github的Xamarin的SQLite类:https: //github.com/praeclarum/sqlite-net/tree/master/src
这是一个关于如何使用所述类的教程:http: //docs.xamarin.com/recipes/ios/data/sqlite/create_a_database_with_sqlitenet
事实证明,我正在使用 CNN_STRING 创建连接对象,该对象只有数据库名称而不是数据库的完整路径。显然,如果文件不存在,连接对象会创建数据库,因此可能不需要 File.Exists(...) 。如果未提供完整路径,我不太确定它是否应该是临时数据库,但似乎确实如此。将连接对象的创建更改为“datasource=”解决了该问题。
| 归档时间: |
|
| 查看次数: |
3749 次 |
| 最近记录: |