我正在开发Windows / Windows Phone通用应用程序。我需要在后台将记录插入sqlite数据库,同时我还需要在不同的页面上显示一些数据。
我的sqlite数据库由20个不同的表组成,后台插入是在所有表中转储记录。
我在sqlite上实现了WAL(Write Ahead Logging),它正在创建wal文件和shm文件。 进程工作正常,直到一些读/写操作并行,但它停止,我的应用程序挂起。
我在firefox中使用sqlitemanager扩展配置了sqlite文件。我用户sqlite-net库。
我是WAL概念的新手。
有什么想法可以继续这个过程吗?
更新
使用类文件处理数据库对象
等待MyClass.ProcessTop10Records();
Task.Run(()=> {MyClass.ProcessRestRecords();});
第一种方法只处理10条记录,然后我制作了另一种方法,它将在后台运行单独的任务,它在数据库中输入记录。
方法逻辑:
RootObject objRootObject = JsonConvert.DeserializeObject<RootObject>(sJsonData);
(这个objRootObject包含一个复杂的json对象。差不多有50个其他子对象)
我有近20张表格,其中插入不同的记录如下:
if (objRootObject != null && objRootObject.objElement != null && objRootObject.objElement.lstRecords != null)
{
MYViewModel.SaveAllRecords(objRootObject.objElement.lstRecords, REFERENCE_ID);
}
public static int SaveAllRecords(List<Record> lst, int REFERENCE_ID)
{
int nResult = 0;
try
{
GlobalVariable.con.RunInTransaction(() =>
{
nResult = GlobalVariable.con.InsertAll(lst.Select(c => new Record
{
Id = c.Id,
value1 = REFERENCE_ID,
value2 = c.value2,
value3 = c.value3,
value4 = Convert.ToString(c.value4),
value5 = Convert.ToString(c.value5),
}));
});
}
catch (Exception)
{
nResult = 0
}
return nResult;
}
在MainPage和其他页面上,我正在从仍在进行插入的同一数据库文件中检索记录。 (我为并发读写操作实现了WAL。)
public ObservableCollection GetRecords() { lstRecords = new ObservableCollection();
var query = GlobalVariable.con.Table<Record>().Where(c => c.bActive);
foreach (var _Item in query)
{
var Item = new Record()
{
nId = _Item.nId,
value1 = _Item.value1,
value2 = _Item.value2,
value3 = _Item.value3,
value4 = _Item.value4,
bActive = _Item.bActive
};
lstRecords.Add(Item);
}
return lstRecords;
}
上面的插入和选择是我放在这里给你看的样本。实际上,还有更多的insert和select方法。有几个记录需要插入到数据库中,这是一个耗时的过程。我不希望我的UI等到所有插入完成。将10-15条记录插入数据库后,我正在填充我的UI。此处并发处理如图所示。
但有时,它会挂起应用程序并且插入过程也会停止。
观点: 1. WAL文件达到4MB后,它总是停止增加它的大小。 SHM文件大小始终为32 kb。
如果我不浏览页面(读取操作),则使用WAL可以正常插入。
当我移除沃尔玛时,事情工作正常,但太慢了。我无法使用多线程,因为手机设备上存在内存问题。