今天我使用SQLite并向项目发送数据库文件。
但是我希望在用户首次启动软件时创建数据库。
有没有办法复制基于现有数据库创建数据库所需的代码?问题在于,当用户下载新版本时,他可能会被欺骗复制到他的上一个数据库并丢失数据。我想要一个很好的方法来检查数据库的版本并修改它,如果我需要新的列或表等。或者,如果它根本不存在,创建一个新的数据库?
我知道我可以创建从头开始创建数据库的代码,但我希望它基于我用gui创建的现有数据库。
回答。最终代码:
//Copy the database from the resource
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("resourcename"))
{
if (stream == null)
throw new NullReferenceException("Stream is null. Cannot find the database in the resources");
FileStream writer = new FileStream(Constants.SqLiteFile, FileMode.Create);
int Length = 256;
Byte[] buffer = new Byte[Length];
int bytesRead = stream.Read(buffer, 0, Length);
// write the required bytes
while (bytesRead > 0)
{
writer.Write(buffer, 0, bytesRead);
bytesRead = stream.Read(buffer, 0, Length);
}
stream.Close();
writer.Close();
}
答案 0 :(得分:1)
嗯......我认为你可以去做两个sqlite数据库之间的同步,我的想法是获取每个数据库的表和字段,并循环它们以查看哪些表和字段在一个而不是另一个。
要开始使用,这些查询对您有用。
-- For getting tables in current db
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
-- For getting info about a table
PRAGMA table_info('tabla_name');
答案 1 :(得分:0)
听起来你只需要一个位置来保存当前系统的版本。创建一个配置表并拥有一条记录,用于维护创建/更新数据库的任何版本。当他们运行安装程序/升级时,请检查该版本是否存在,以及/或确定了采取的步骤以确定要采取的步骤。