2011-09-16 80 views
0

我有一个onCreate,当前打开一个sqlite数据库并读取4个值。然后我有一个条件,并根据哪些活动发送它在那里显示这些值或更新两个值,然后显示另一个。Android提高SQLite性能优化

现在,如果我在不更新数据库的情况下运行此活动,它闪电般快速。而如果我运行两个查询来写入数据库,它可能会很慢。有什么我能做的,以优化这一点。

问题是显示会停留在上一个活动,直到sqlite更新完成。这似乎是问题所在。

对不起,最有可能是垃圾的解释。请随时要求我更好地描述任何事情。

任何帮助表示赞赏。

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    setContentView(R.layout.reason); 

    //Opens DB connection 

    type = b.getString("TYPE"); 


    get(); 
    if(type.equals("next")){ update();} 
    db.close(); 
    } 


    public void get(){  
Cursor b = db.rawQuery("SELECT * FROM " + 
     DB_TABLE2 +" WHERE _id='1'" , null); 
b.moveToFirst(); 
id = b.getInt(b.getColumnIndex("nextq")); 
    nextvalue = b.getInt(b.getColumnIndex(type)); 
if(nextvalue==0){nextvalue=1;} 
b.close();   
nextvalue ++; 
    } 

    public void update(){ 
db.execSQL("UPDATE " 
     + DB_TABLE2 
     + " SET nextq='" + nextvalue + "'" 
     + " WHERE _id='1'"); 
db.execSQL("UPDATE " 
     + DB_TABLE 
     + " SET answered_correctly='" + anscorrect +"' , open ='1' WHERE _id='" + id + "'"); 
    } 
+0

数据库有多大?我很惊讶你可以注意到两个简单的更新语句的滞后,有些东西似乎很腥。 – dmon

+0

它只有100行。这就是为什么即时通讯咨询它似乎很奇怪。 – Somk

回答

0

你可以做这样的事情,但要警告,Pragma Syncronize设置可能是危险的,因为它会关闭Sqlite中的安全功能。话虽如此,它增加了我的记录,以每排大约为0.5ms,或者从350毫秒下降到15-20,并为另一个表,从5000-9000ms下降到大约300

// this cut down Insert time from 250-600ms to 14-30 ms. 
    // with prgma syncronous set to off, this drops it down to 0.5ms/row for membernames 
    final InsertHelper ih = new InsertHelper(database, SQLiteHelper.TABLE_MEMBERS); 
    final int nameColumn = ih.getColumnIndex(SQLiteHelper.MEMBER_TABLE_MEMBERNAME); 
    final long startTime = System.currentTimeMillis(); 

    try { 
     database.execSQL("PRAGMA synchronous=OFF"); 
     database.setLockingEnabled(false); 
     database.beginTransaction(); 
     for (int i = 0; i < Members.size(); i++) { 
      ih.prepareForInsert(); 

      ih.bind(nameColumn, Members.get(i)); 

      ih.execute(); 
     } 
     database.setTransactionSuccessful(); 
    } finally { 
     database.endTransaction(); 
     database.setLockingEnabled(true); 
     database.execSQL("PRAGMA synchronous=NORMAL"); 
     ih.close(); 
     if (Globals.ENABLE_LOGGING) { 
      final long endtime = System.currentTimeMillis(); 
      Log.i("Time to insert Members: ", String.valueOf(endtime - startTime)); 
     } 
    } 

主要的东西你想要的是InsertHelper,“SetLockingEnabled”功能和“execSQL Pragma ...”。请记住,正如我所说,如果在手机上遇到停电,使用这两种方法都可能导致数据库损坏,但可以大大加快数据库插入的速度。我从这里了解到这个:http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/#comment-2685

你也可以忽略我的日志记录的东西,我在那里做了某种基准测试,看看事情发生了多快。我简单地解释了SQLite中的安全和完整性功能,以便基本上将数据传输到数据库中。由于这种情况发生得很快(现在平均大约14-20ms),风险是可以接受的。如果这需要花费几秒钟的时间,我不会冒险,因为如果发生什么事情,您可能会损坏数据库。 Syncronize期权是所有人面临的最大风险,因此请判断您是否希望利用数据承担风险。我建议使用像我包含的计时功能,看看每次尝试某些操作时将数据插入到数据库需要多长时间,然后确定需要的风险级别。即使你不使用这两个,其他功能(InsertHelper和BeginTransaction的东西)也会帮助你极大地改善你的数据库工作。

0

可以创建一个新线程的数据库上运行,并有UI更新的回调,或者如果用户界面是不依赖于数据库的变化只需要创建一个新的线程。在UI线程上执行数据库的东西总是会减慢UI的响应速度。如果UI完全不需要回调,请检查AsyncTasks或仅创建一个新线程。

只是要小心,不要让与创建线程:)

+0

我可以看到的问题是,从这个活动链接回到以前依靠这些更新。如果我在后台运行这些更新,用户可以在更新完成之前再次点击上一个活动?对不起,我对运行ASync任务不够了解 – Somk

+0

不一定。您可以拦截后退按钮并等待或设置线程安全标志 - 例如AtomicBoolean - 回滚事务的地方。显然,使用交易,这样你可以放弃他们:)。您还应该考虑用户按Home并重新输入您的应用程序的情况 - 您不应该假设在活动之间进行导航时完成的交易(除非您有可以提供该担保的服务)。 – Delyan

2

附上所有更新的一个transaction里面太不小心了。从数据完整性的角度来看,它不仅更好,而且速度也更快。

因此,在update()开始时输入db.beginTransaction(),最后输入db.setTransactionSuccessful(),然后输入db.endTransaction()

+0

字面上只是用这些方法包含update()的内容?你能链接到一个例子或教程。我还没有遇到过。谢谢 – Somk

+0

请参阅下面的答案 –