Tworzyłem prostą aplikację sterowaną sqlite dla ios przy użyciu xamarin studio na mac.Baza danych nie utrzymywała się między kompilacjami z xamarin ios
Plik sqlite jest tworzony w folderze "osobistym" i jest przechowywany między kompilacjami, ale kiedy uruchomię aplikację, tabele utworzone w poprzedniej sesji debugowania zniknęły?
W moim kodzie, po sprawdzeniu, że plik istnieje, łączę się za pomocą sqliteconnection i utworzyć tabelę i wstawić wiersz z metodą execenonquery z obiektu command. Podczas gdy w tym samym kontekście mogę zapytać o tabelę przy użyciu drugiego obiektu polecenia, ale jeśli zatrzymam debuggera i zrestartuję tabelę i zniknę?
Czy mam plik w innym folderze, czy jest to ustawienie w Xamarin lub ios, aby zachować tabele? Czy nieumyślnie używam tabel tymczasowych w sqlite lub jaki może być problem?
Uwaga: do tej pory używam tylko wersji startowej Xamarin i debugowania na symulatorze iPhone'a.
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);
}
}
Ponownie, moim problemem jest to, że za każdym razem uruchomić debugger działa GetUserVersion ale UVERSION tabela nie jest zachowywane między sesjami. "File.Exists (dbPath)" zwraca true, więc CreateFile nie jest uruchamiany. Dlaczego baza danych jest pusta?
Wygląda na to, że za każdym razem uruchamia się twój kod inicjujący. Czy możesz wysłać próbkę kodu? – Jason