Android   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android SQLite大行数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

需要在sqlite数据库中本地存储大约20,000行信息​​.只有两列包含短文本字符串,因此实际的数据量很小,但我很难在设备上花3-5分钟插入行.我试过直接循环遍历数据集并调用一个简单的WritableDatabase.Insert,但这需要很长时间.所以我做了一些研究并被带到了the InsertHelper class,其中作者网站以大约900行/秒的速度处理行(这应该让我在20-30秒).我仍然无法在3-5分钟内处理数据.我错过了什么?性能因设备而异吗?使用ZTE Optik Android 3.2.1.

public class sqliteHelper : sqliteOpenHelper
{
    private const String DATABASE_NAME = "NAME";
    private const int DATABASE_VERSION = 1;
    private readonly Context _context;

    public sqliteHelper(Context context)
        : base(context, DATABASE_NAME, null, DATABASE_VERSION)
    {
        _context = context;
    }

    public override void OnCreate(sqliteDatabase db)
    {
        try
        {
            db.Execsql("create table Inventory (Itemnumber Text PriMary Key Not Null, ItemDescription Text);");
        }
        catch (sqliteException eX)
        {
            Toast.MakeText(_context, ex.message, ToastLength.Long).Show();
        }
    }

    public override void OnUpgrade(sqliteDatabase db, int oldVersion, int newVersion)
    {
    }
}

class InventoryRepository : AsyncTask
{
    private sqliteHelper Helper { get; set; }
    private Context Context { get; set; }

    public InventoryRepository(sqliteHelper Helper, Context context)
    {
        Helper = Helper;
        Context = context;
    }

    protected override Java.Lang.object DoInBACkground(params Java.Lang.object[] @params)
    {
       WS ws = new WS();
       Datatable parts = ws.GeTinventory();  //Web service getTing inventory items from Server

        Helper.WritableDatabase.delete("Inventory", null, null);

        DatabaseUtils.InsertHelper ih = new DatabaseUtils.InsertHelper(Helper.WritableDatabase, "Inventory");

        Helper.WritableDatabase.SetLockingEnabled(false);

        int partcolumn = ih.GetcolumnIndex("Itemnumber");
        int partDesccolumn = ih.GetcolumnIndex("ItemDescription");

        Helper.WritableDatabase.begintransaction();

        try
        {

            foreach (Da@R_951_2301@w part in parts.Rows)
            {
                try
                {
                    ih.PrepareForinsert();

                    ih.bind(partcolumn, part[0].ToString().replace("'", "''"));
                    ih.bind(partDesccolumn, part[1].ToString().replace("'", "''"));

                    ih.Execute();
                }
                catch (sqliteException eX)
                {
                    if (ex.message.Contains("consTraint"))
                        conTinue;
                    throw;
                }
                catch (NullReferenceException E)
                {
                    conTinue;
                }
            }
            Helper.WritableDatabase.Settransactionsuccessful();

        }
        finally
        {
            Helper.WritableDatabase.Endtransaction();
            Helper.WritableDatabase.SetLockingEnabled(true);
            ih.Close();
        }

        return "Done";
    }

    protected override void OnPostExecute(Java.Lang.object result)
    {
        PreferenceManager.GetDefaultSharedPreferences(Context).Edit().PutString("LasTinventoryupdate", datetiR_801_11845@e.Today.ToShortDateString()).Commit();
        Intent intent = new Intent(Context, typeof(Login));
        intent.AddFlags(ActivityFlags.NewTask);
        Context.StartActivity(intent);
    }
}

解决方法:

在事务中包装整个插入循环.这将使事情加快一个数量级.

db.begintransaction();
try {
    // your insertion loop goes here
    db.settransactionsuccessful();
} finally {
    db.endtransaction();
}

大佬总结

以上是大佬教程为你收集整理的Android SQLite大行数全部内容,希望文章能够帮你解决Android SQLite大行数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: