如何解决如何使用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 举报,一经查实,本站将立刻删除。