1

我对此有点陌生。我想通过https://github.com/praeclarum/sqlite-net/blob/master/examples/Stocks/Stocks.cs使用 SQLite-net dealio

这就是我得到这个代码的确切例子。我喜欢能够超级快速和干净地声明我的模型的想法。

但是,我让它运行。我想知道它是否会创建一个新的数据库以及每次运行时的所有内容,如果您要像它建议的那样从 appdelegate 类调用它。

new _db = new Database();

这就是它在应用程序委托类中使用的东西,我有点被它吓坏了。我需要保持数据。有人可以告诉我这是否会每次都重新创建,如果是这样,如何创建数据库,我的模型类中的表并将它们保存在一个只创建一次的普通数据库文件中。

任何帮助表示赞赏!

public class Database : SQLiteConnection
{
    public Database (string path) : base(path)
    {
        CreateTable<Stock> ();
        CreateTable<Valuation> ();
    }
    // more code here
}
4

3 回答 3

3

CreateTable() 方法确实创建了表(如果它不存在),但它不会破坏表中已经存在的任何数据。

于 2013-02-14T13:49:57.893 回答
1

我有点搞砸了。答案是,如果它们不存在,它将创建这些表。

与使用SQLiteConnection这种方式创建数据库不同,使用sqliteconnection并检查数据库是否存在更容易。然后,如果 db 文件不存在,则有一个方法可以构建您的表。下面有一个代码示例。

这使您能够使用 MVC 模型方法创建所有类,并利用https://github.com/praeclarum/sqlite-net库,同时仍然以编程方式构建数据库,而无需使用实际的 sql 语句

public class Database
{
    static string documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
    // I do this so I can access the path without having to create an instance of the datbase class
    public static string db = Path.Combine (documents, "dbAwesome.db");
    static bool exists = File.Exists(db);

    public void GetConnection()
    {
        if (!exists) {
            SqliteConnection.CreateFile (db);
            // Custom methods to create initial tables and values for tables
            CreateMyTables ();
            InsertDefaultValues ();
        }
    }
}
于 2013-02-14T00:55:08.347 回答
0

SQLite.Net 是一个 ORM。如果您使用它(Sqlite.cs),它不会重新创建表。

“在数据库上执行“如果不存在则创建表””方法摘要说。正如您在代码中看到的那样;如果执行失败,计数将为 0,并且代码通过现有 ORM 映射创建索引。

它只是看起来 ORM 映射,如果它存在行为不同,如下所示。

它还为 ORM 创建索引,因为您知道我们应该使用 [PrimaryKey]。通过这种方式 CRUD 操作调用。

      /// <summary>
            /// Executes a "create table if not exists" on the database. It also
            /// creates any specified indexes on the columns of the table. It uses
            /// a schema automatically generated from the specified type. You can
            /// later access this schema by calling GetMapping.
            /// </summary>
            /// <returns>
            /// The number of entries added to the database schema.
            /// </returns>
            public int CreateTable<T> ()
            {
                    var ty = typeof(T);

                    if (_tables == null) {
                            _tables = new Dictionary<string, TableMapping> ();
                    }
                    TableMapping map;
                    if (!_tables.TryGetValue (ty.FullName, out map)) {
                            map = GetMapping (ty);
                            _tables.Add (ty.FullName, map);
                    }
                    var query = "create table \"" + map.TableName + "\"(\n";

                    var decls = map.Columns.Select (p => Orm.SqlDecl (p));
                    var decl = string.Join (",\n", decls.ToArray ());
                    query += decl;
                    query += ")";

                    var count = 0;

                    try {
                            Execute (query);
                            count = 1;
                    }
                    catch (SQLiteException) {
                    }

                    if (count == 0) {
                            // Table already exists, migrate it
                            MigrateTable (map);
                    }

                    foreach (var p in map.Columns.Where (x => x.IsIndexed)) {
                            var indexName = map.TableName + "_" + p.Name;
                            var q = string.Format ("create index if not exists \"{0}\" on \"{1}\"(\"{2}\")", indexName, map.TableName, p.Name);
                            count += Execute (q);
                    }

                    return count;
            }
于 2013-02-14T16:36:08.287 回答