如何使用SQLiteOpenHelper创建多个用户输入表?

如何解决如何使用SQLiteOpenHelper创建多个用户输入表?

我正在尝试使用sqliteOpenHelper开发数据库GUI来存储我的表。我想这样做,以便用户可以创建自己的表和相应的列。因此,我通过将用户的响应保存在Xamarin.Essentials.Preferences中的键/值对中来接受用户输入,然后检索它们并在数据库帮助器类和代码的其余部分中将它们实现为表名,第1列。 ,第2列,第3列和第4列,如下所示:

public class DBHelper : sqliteOpenHelper
    {
        //database name
        private const string DATABASE_NAME = "Test.db3";
        //database version
        private const int DATABASE_VERSION = 1;

        private static readonly string tableName = GetPrefs("table_name");
        private static readonly string column1 = GetPrefs("column1");
        private static readonly string column2 = GetPrefs("column2");
        private static readonly string column3 = GetPrefs("column3");
        private static readonly string column4 = GetPrefs("column4");


        readonly string createTable =
            "CREATE TABLE IF NOT EXISTS " + tableName + " (" +
            "Id INTEGER PRIMARY KEY AUTOINCREMENT," +
            column1 + " TEXT NOT NULL," +
            column2 + " TEXT NOT NULL," +
            column3 + " TEXT NOT NULL," +
            column4 + " TEXT NOT NULL," +
            "DateAdded TEXT NOT NULL)"
            ;

        public DBHelper(Context c) : base(c,DATABASE_NAME,null,DATABASE_VERSION)
        {
        }


        //create table
        public override void OnCreate(sqliteDatabase db)
        {

            db.Execsql(createTable);
        }

        //upgrade version of table by dropping it and recreating it
        public override void OnUpgrade(sqliteDatabase db,int oldVersion,int newVersion)
        {
            db.Execsql("DROP TABLE IF EXISTS " + tableName);
            OnCreate(db);
        }

        //retrieve the info for processing and formating them to a cursor
        public virtual IList<EntryInfo> GetAllContacts()
        {
            sqliteDatabase db = this.ReadableDatabase;
            ICursor c = db.Query(tableName,new string[] { "Id",column1,column2,column3,column4,"DateAdded" },null);
            var contacts = new List<EntryInfo>();
            while (c.MovetoNext())
            {
                contacts.Add(new EntryInfo
                {
                    id = c.GetInt(0),column1 = c.GetString(1),column2 = c.GetString(2),column3 = c.GetString(3),column4 = c.GetString(4),dateAdded = c.GetString(5)

                });

            }
            c.Close();
            db.Close();
            return contacts;
        }

        //retrieve entries based off of a search name
        public virtual IList<EntryInfo> GetContactsByColumn1(string column1)
        {
            sqliteDatabase db = this.ReadableDatabase;

            ICursor c = db.Query(tableName,"upper(" + column1 + ") LIKE ?",new string[] { "%" + column1.toupper() + "%" },null);

            var contacts = new List<EntryInfo>();

            while (c.MovetoNext())
            {
                contacts.Add(new EntryInfo
                {
                    id = c.GetInt(0),dateAdded = c.GetString(5)

                });
            }

            c.Close();
            db.Close();
            return contacts;
        }

        //add contacts to content values and insert into database
        public virtual void AddContact(EntryInfo entry)
        {
            sqliteDatabase db = this.ReadableDatabase;
            ContentValues contentValues = new ContentValues();
            contentValues.Put(column1,entry.column1);
            contentValues.Put(column2,entry.column2);
            contentValues.Put(column3,entry.column3);
            contentValues.Put(column4,entry.column4);
            contentValues.Put("DateAdded",entry.dateAdded);

            db.Insert(tableName,contentValues);
        }

        //retrieve entry by id
        public virtual ICursor GetContactById(int id)
        {
            sqliteDatabase db = this.ReadableDatabase;
            ICursor res = db.RawQuery("SELECT * FROM " + tableName + " WHERE Id=" + id + "",null);
            return res;
        }

        //update the contact on edit
        public virtual void UpdateContact(EntryInfo entry)
        {
            if (entry == null)
            {
                return;
            }


            sqliteDatabase db = this.WritableDatabase;

            ContentValues vals = new ContentValues();
            vals.Put(column1,entry.column1);
            vals.Put(column2,entry.column2);
            vals.Put(column3,entry.column3);
            vals.Put(column4,entry.column4);
            vals.Put("DateAdded",entry.dateAdded);


            ICursor cursor = db.Query(tableName,new String[] { "Id","Id=?",new string[] { entry.id.ToString() },null);

            if (cursor != null)
            {
                if (cursor.MovetoFirst())
                {
                    // update the row
                    db.Update(tableName,vals,new String[] { cursor.GetString(0) });
                }

                cursor.Close();
            }

        }

        //delete entry
        public virtual void DeleteContact(string entryId)
        {
            if (entryId == null)
            {
                return;
            }

            sqliteDatabase db = this.ReadableDatabase;
            ICursor cursor = db.Query(tableName,new string[] { entryId },null);

            if (cursor != null)
            {
                if (cursor.MovetoFirst())
                {
                    db.Delete(tableName,new String[] { cursor.GetString(0) });
                }
                cursor.Close();
            }

        }

        //get the preference
        private static string GetPrefs(string name)
        {
            return Preferences.Get(name,null);
        }

此问题是在重建应用程序并创建表之后,它会相应地创建新表。但是,当您尝试在同一会话中创建第二张表时,该表不会被创建。而是,当您在应用程序内访问表时,它仍指向带有先前输入项的先前创建的表。调试后,我发现OnCreate方法和应该采用新的首选项值的字段不会再次被调用。结果,该应用程序可能随后崩溃,因为它试图从不存在的表中检索值。

对此有任何建议吗?我想到的一种解决方案是,在创建新表时以确保可以从顶部再次调用DBHelper的方式重新启动应用程序,但这显然是多余的。

与往常一样,如果您需要进一步的说明或代码,请随时询问。这只是sqlite助手类,而不是整个代码库,更多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?