【发布时间】:2021-08-09 14:24:04
【问题描述】:
我正在将 3000 多个数据从我的服务器插入到我的 SQLite 数据库中。问题是插入过程非常慢。有没有更好的方法来有效地插入数据?我正在做的是将我从服务器获得的数据转换为 JSON 对象,并一个接一个地插入它。我知道我在做什么是低效的。我该如何解决这个问题?
public class AndroidSQLiteDb : ISQLiteDB
{
public SQLiteAsyncConnection GetConnection()
{
var dbFileName = "backend.db3";
var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var path = Path.Combine(documentsPath, dbFileName);
return new SQLiteAsyncConnection(path);
}
}
public async void FirstSyncContacts(string host, string database, string contact)
{
try
{
var db = DependencyService.Get<ISQLiteDB>();
var conn = db.GetConnection();
var sql = "SELECT * FROM tblContacts WHERE Coordinator = '" + contact + "'";
var getContacts = conn.QueryAsync<ContactsTable>(sql);
var resultCount = getContacts.Result.Count;
var current_datetime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:00");
//Check if the retailer has been sync
if (resultCount < 1)
{
try
{
syncStatus.Text = "Syncing Retailer";
var link = Constants.requestUrl + "Host=" + host + "&Database=" + database + "&Contact=" + contact + "&Request=9DpndD";
string contentType = "application/json";
JObject json = new JObject
{
{ "ContactID", contact }
};
HttpClient client = new HttpClient();
var response = await client.PostAsync(link, new StringContent(json.ToString(), Encoding.UTF8, contentType));
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
if (content != "")
{
var contactsresult = JsonConvert.DeserializeObject<List<ContactsData>>(content);
foreach (var item in contactsresult)
{
// update only the properties that you have to...
item.LastSync = Convert.ToDateTime(current_datetime);
item.ServerUpdate = Convert.ToDateTime(item.ServerUpdate);
item.MobileUpdate = Convert.ToDateTime(item.MobileUpdate);
}
await conn.InsertAsync(contactsresult);
}
}
//Proceed to next function
FirstSyncRetailerGroup(host, database, contact);
}
catch (Exception ex)
{
Console.Write("Syncing Retailer Error " + ex.Message);
}
}
//If not get the retailer
else
{
SyncContacts(host, database, contact);
}
}
catch (Exception ex)
{
Console.Write("Syncing Retailer Error " + ex.Message);
}
}
【问题讨论】:
-
在一个后台线程中使用非异步
Insert,而不是3000个单独的异步调用...创建ContactsTable的一个实例并重用(在每个插入循环中重置/设置它的所有属性迭代(将节省大量 GC 时间),无需将所有这些 json 属性(item.XXX)分配给另一个局部变量,只需将它们重新分配给 ContactsTable 的属性即可。 -
@SushiHangover 你能告诉我怎么做吗?
-
@SushiHangover 我真的需要帮助
-
@LawrenceAgulto 请避免在 sqlite 中使用 json。 SQLite 仅用于您的内部目的。因此,您可以在没有 JSON 的情况下进行管理。如果你避免这种情况,你可以看到速度差异
-
@RanjithKumar 我怎样才能避免这种情况?你能告诉我怎么做吗?
标签: xamarin xamarin.forms