为什么PhoneGap的Andr​​oid应用程序崩溃的同时插入一堆数据到SQL? [英] Why is PhoneGap Android app crashing while inserting bunch of data into SQL?

查看:165
本文介绍了为什么PhoneGap的Andr​​oid应用程序崩溃的同时插入一堆数据到SQL?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android的应用程序的PhoneGap运行。当应用程序启动时,它把大约500行插入SQL。表有10列。这不是大量的数据,我有一个JSON的文本文件,其大小约为120 KB。我认为这不能碰在所有的任何限制,但有可能是一些限制我不知道或者在Android中的一个错误,因为这个相同的应用程序上没有问题,某些版本的Andr​​oid(2.2)的运行,但立即崩溃或者在几分钟内时,与其它Android版本的SQL数据库工作(1.6,2.1,2.3的一些可能更多...)

下面是code我用它来填充的崩溃在Android 1.6的数据库:

  DB = window.openDatabase(DB,1.0,说明,1000000);
$获得(DB / app_data.dat',函数(结果){
  VAR数据= $ .parseJSON(结果);
  尝试 {
    db.transaction(函数(德克萨斯州){
      $每个(data.items,功能(I,V){
        尝试 {
          tx.executeSql(INSERT INTO表(C1,C2,C3,...)VALUES(?,?,?,?)',[v.c1,v.c2,v.c3,...] );
        }赶上(五){
          警报(e.message);
        }
      });
    });
  }赶上(五){
    警报(e.message);
    返回;
  }
});
 

任何人可以帮助我吗?有一些限制,我不知道的吗?还是我做错了什么,在SQL数据库中插入数据时?

编辑:

下面是LogCat中的输出,我觉得这些都是一些重要的线路,从日志时,应用程序崩溃。不过,我对Java和Android没有更深入的了解:

  WARN / dalvikvm(1525):ReferenceTable溢出(最大值= 512)
WARN / dalvikvm(1525):在JNI本地参照表最后10项:
WARN / dalvikvm(1525):502:0x4375cbb8 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):503:0x4374c9a0 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):504:0x4377c5c0 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):505:0x437c3040 CLS = Ljava /朗/字符串; (36字节)
WARN / dalvikvm(1525):506:0x43760bd8 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):507:0x437625e8 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):508:0x43762608 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):509:0x43762628 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):510:0x43759178 CLS = Ljava /朗/字符串; (28字节)
WARN / dalvikvm(1525):511:0x43766808 CLS = Landroid / WebKit的/ WebViewCore; (116字节)
ERROR / dalvikvm(1525):无法增加JNI本地参考表(有512项)
信息/ dalvikvm(1525):WebViewCoreThreadPRIO = 5 TID = 15 RUNNABLE
信息/ dalvikvm(1525)|组=主SCOUNT = 0 dsCount = 0 S = N的obj = 0x437668a0自我= 0x1b0bd0
信息/ dalvikvm(1525)| sysTid = 1532漂亮= 0章附表= 0/0手柄= 1772784
信息/ dalvikvm(1525):在android.webkit.LoadListener.nativeFinished(本机方法)
信息/ dalvikvm(1525):在android.webkit.LoadListener.tearDown(LoadListener.java:1076)
信息/ dalvikvm(1525):在android.webkit.LoadListener.handleEndData(LoadListener.java:642)
信息/ dalvikvm(1525):在android.webkit.LoadListener.handleMessage(LoadListener.java:203)
信息/ dalvikvm(1525):在android.os.Handler.dispatchMessage(Handler.java:99)
信息/ dalvikvm(1525):在android.os.Looper.loop(Looper.java:123)
信息/ dalvikvm(1525):在android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:471)
信息/ dalvikvm(1525):在java.lang.Thread.run(Thread.java:1060)
ERROR / dalvikvm(1525):虚拟机中止
调试/合子(30):过程1525由信号终止(11)
 

解决方案

火卫一的回答有一定的相关信息,但并不包括如何将其应用于您的问题或如何解决您的特定问题。我遇到了一个类似的问题,而这样做跨到Java通过绑定到的WebView上下文addJavascriptInterface对象调用Android的一些JavaScript的性能测试。我虽然没有明确使用JNI,显然是在幕后绑定接口使用JNI来编码数据跨越 - 我得到了一个错误和堆栈跟踪类似于你。显然,webDB或localStorage的或任何你正在做那里也使用JNI被窝里。

根据的信息是火卫一的联系,有一个有限的限制,以引用您可以在范围内,当您使用JNI的数量。在该间接地使用JNI的javascript的情况下,似乎引用必须保持围绕基于JavaScript的范围。看你的code,我不知道你在做什么超出了极限,但它看起来像它可以是调用的次数你让整体交易或你的价值观阵列最终有超过512的元素。如果您需要preserve事务的完整性,真正有超过500个运营你可能是出于运气。不过,我怀疑你应该能够找到一种方法,通过重写你的code建立的范围之外 tx.executeSql 调用。

也许你可以重写code建立你的查询字符串,然后实际调用 tx.executeSql 匿名函数包装里面?你可能需要建立一个包含这些值,而不是使用INSERT INTO表()VALUES()'字符串,[] 语法...正如我上面所说的,如果你有500多个业务交易,你可能仍然遇到麻烦,但它是值得一试!

P.S。作为参考,这里是一个版本,我的code这是与修复崩溃沿:

  VAR测试=功能(){
    变种一个=一个;
    对于(i = 0; I< 1000;我++){
        boundJavaObj.test(一);
    }
}
 

试验()与崩溃类似的错误:

10月3日至二十八号:57:45.634:W / dalvikvm(21294):ReferenceTable溢出(最大值= 512)

  VAR测试2 =功能(){
    变种一个=一个;
    对于(i = 0; I< 1000;我++){
        (函数(){boundJavaObj.test(一);})();
    }
}
 

测试2()不会崩溃。

I have PhoneGap app running in Android. When the app starts, it inserts approximately 500 rows into SQL. Table has 10 columns. It's not a lot of data, I have a JSON in textfile and its size is about 120 kB. I thought this couldn't touch any limits at all, but there is probably some limitation I don't know about or maybe a bug in Android, because this same app runs on some versions of Android (2.2) without problem, but crashes immediately or in few minutes when working with the SQL database on other versions of Android (1.6, 2.1, some 2.3 probably more...)

Here is the code I use to populate the DB that crashes on Android 1.6:

db = window.openDatabase("db", "1.0", "Description", 1000000); 
$.get('db/app_data.dat',function(result){
  var data = $.parseJSON(result);
  try {
    db.transaction(function(tx){
      $.each(data.items, function(i, v){
        try {
          tx.executeSql('INSERT INTO table(c1,c2,c3, ...) VALUES (?,?,?, ...)',[v.c1, v.c2, v.c3, ...]);
        } catch(e) {
          alert(e.message);
        }
      });
    });
  } catch(e) {
    alert(e.message);
    return;
  }
});

Can anybody help me ? Is there some limit I don't know about ? Or am I doing something wrong when inserting data in the SQL database ?

EDIT:

Here is output of LogCat, I think these are some important lines from log when app crashes. However, I have no deeper knowledge of Java and Android:

WARN/dalvikvm(1525): ReferenceTable overflow (max=512)
WARN/dalvikvm(1525): Last 10 entries in JNI local reference table:
WARN/dalvikvm(1525):   502: 0x4375cbb8 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   503: 0x4374c9a0 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   504: 0x4377c5c0 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   505: 0x437c3040 cls=Ljava/lang/String; (36 bytes)
WARN/dalvikvm(1525):   506: 0x43760bd8 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   507: 0x437625e8 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   508: 0x43762608 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   509: 0x43762628 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   510: 0x43759178 cls=Ljava/lang/String; (28 bytes)
WARN/dalvikvm(1525):   511: 0x43766808 cls=Landroid/webkit/WebViewCore; (116 bytes)
ERROR/dalvikvm(1525): Failed adding to JNI local ref table (has 512 entries)
INFO/dalvikvm(1525): "WebViewCoreThread" prio=5 tid=15 RUNNABLE
INFO/dalvikvm(1525):   | group="main" sCount=0 dsCount=0 s=N obj=0x437668a0 self=0x1b0bd0
INFO/dalvikvm(1525):   | sysTid=1532 nice=0 sched=0/0 handle=1772784
INFO/dalvikvm(1525):   at android.webkit.LoadListener.nativeFinished(Native Method)
INFO/dalvikvm(1525):   at android.webkit.LoadListener.tearDown(LoadListener.java:1076)
INFO/dalvikvm(1525):   at android.webkit.LoadListener.handleEndData(LoadListener.java:642)
INFO/dalvikvm(1525):   at android.webkit.LoadListener.handleMessage(LoadListener.java:203)
INFO/dalvikvm(1525):   at android.os.Handler.dispatchMessage(Handler.java:99)
INFO/dalvikvm(1525):   at android.os.Looper.loop(Looper.java:123)
INFO/dalvikvm(1525):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:471)
INFO/dalvikvm(1525):   at java.lang.Thread.run(Thread.java:1060)
ERROR/dalvikvm(1525): VM aborting
DEBUG/Zygote(30): Process 1525 terminated by signal (11)

解决方案

Phobos' answer has some pertinent information, but it doesn't include how it applies to your problem or how to fix your specific problem. I ran into a similar issue while doing some performance testing in android javascript that calls across to java via an object bound into the webview context with addJavascriptInterface. Although I am not explicitly using JNI, apparently under the covers the bound interface uses JNI to marshall the data across - I was getting an error and stack trace similar to yours. Apparently, webDB or localStorage or whatever you are doing there also uses JNI under the covers.

As per the info that Phobos linked, there is a finite limit to the number of references you can have in scope when you are using JNI. In the case of javascript that indirectly uses JNI, it seems that the references must be kept around based on the javascript scope. Looking at your code, I'm not sure exactly what you are doing to exceed the limit, but it looks like it could be either the number of calls you make in the transaction overall or your values arrays end up having more than 512 elements. If you need to preserve transactional integrity and you really have over 500 operations you might be out of luck. However I suspect that you should be able to find a way to avoid the 512 limit by rewriting your code to build up a query string outside of the scope of the tx.executeSql call.

Maybe you could rewrite the code to build your query strings and then actually call tx.executeSql inside an anonymous function wrapper? You probably need to build strings containing the values instead of using the 'INSERT INTO table() VALUES()',[] syntax... As I said above, if you have more than 500 operations in a transaction, you might still run into trouble, but it would be worth a try!

P.S. For reference, here is a version of my code that was crashing along with the fix:

var test = function() {
    var a = "a";
    for(i=0;i<1000;i++) {
        boundJavaObj.test(a);
    }
}

test() crashes with an error like:

03-28 10:57:45.634: W/dalvikvm(21294): ReferenceTable overflow (max=512)

var test2 = function() {
    var a = "a";
    for(i=0;i<1000;i++) {
        (function(){boundJavaObj.test(a);})();
    }
}

test2() doesn't crash.

这篇关于为什么PhoneGap的Andr​​oid应用程序崩溃的同时插入一堆数据到SQL?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆