我有在Android中运行的PhoneGap应用。应用启动时,它将在SQL中插入大约500行。表有10列。它的数据不是很多,我在文本文件中有一个JSON,它的大小约为120
kB。我以为这根本无法解决任何限制,但是可能存在一些我不了解的限制,或者可能是Android中的错误,因为同一应用程序可以在某些版本的Android(2.2)上正常运行,但立即崩溃或在其他版本的Android上使用SQL数据库(几分钟,1.6、2.1,大约2.3甚至更多……)时,也可能需要几分钟
这是我用来填充在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;
}
});
有谁能够帮我 ?我不知道有什么限制吗?还是在SQL数据库中插入数据时我做错了什么?
编辑:
这是LogCat的输出,我认为这些是应用崩溃时日志中的一些重要内容。但是,我对Java和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的答案包含一些相关信息,但不包括它如何应用于您的问题或如何解决您的特定问题。我在android
javascript中进行一些性能测试时遇到了类似的问题,该测试通过使用addJavascriptInterface绑定到webview上下文中的对象调用java。尽管我没有明确地使用JNI,但显然在绑定的幕后,使用JNI来整理数据的绑定接口-我遇到了与您类似的错误和堆栈跟踪。显然,webDB或localStorage或您在此处所做的任何事情都在幕后使用JNI。
根据Phobos链接的信息,使用JNI时,作用域中的引用数有一个有限的限制。对于间接使用JNI的javascript,似乎必须根据javascript范围保留引用。查看您的代码,我不确定您要超出限制的确切方式,但看起来可能是您在整个事务中进行的调用次数,或者值数组最终包含超过512个元素。如果您需要维护事务的完整性,并且确实有500多次操作,那么您可能会很不幸。但是我怀疑您应该能够通过重写代码以在tx.executeSql
调用范围之外建立查询字符串来找到避免512限制的方法。
也许您可以重写代码以构建查询字符串,然后tx.executeSql
在匿名函数包装器中实际调用?您可能需要构建包含值的字符串而不是使用'INSERT INTO table() VALUES()',[]
语法…如上所述,如果一个事务中有500个以上的操作,您仍然可能会遇到麻烦,但是值得尝试!
PS供参考,以下是我的代码版本及其修复程序崩溃:
var test = function() {
var a = "a";
for(i=0;i<1000;i++) {
boundJavaObj.test(a);
}
}
test()崩溃,并显示如下错误:
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()不会崩溃。
问题内容: 在我的代码中,用户可以上传一个excel文档,希望其中包含电话联系人列表。作为开发人员,我应阅读excel文件,将其转换为dataTable并将其插入数据库。问题是某些客户拥有大量的联系人,例如说5000个和更多的联系人,而当我尝试将这种数据量插入数据库时,它崩溃了,并给了我一个超时异常。避免这种异常的最佳方法是什么?它们的任何代码都可以减少insert语句的时间,从而使用户不必等
我使用的是IntelliJIDEA CE edition(11.0.4)的最新版本。有一件事我在任何地方都找不到,它阻碍了我对Java/Spring的进一步改进。 控制器: 类:导入com.example.demo.interfaces.ISave; 类接口: 没什么特别的,只是为了掌握Spring和Java。 在我的控制器里,当我试图使用 我收到一个阻止应用启动的错误。以下是错误: 任务应用程序
我试图调用ViewModel中片段中的函数,但每次调用时它都会崩溃,我不知道为什么。下面是代码: 呼吁协程: 函数的代码: 如果我不使用协同程序,只使用我收到一个错误,说我必须从其他挂起函数或协同程序调用这个函数。 这就是错误: 我的ViewModel是: 在我称之为协程的片段中,我这样声明它:
问题内容: 我读到这里:使用Python将CSV文件导入sqlite3数据库表 似乎每个人都建议使用逐行读取,而不是使用SQLite的bulk .import。但是,如果您有数百万行的数据,这将使插入速度非常慢。还有其他方法可以避免这种情况吗? 更新:我尝试下面的代码逐行插入,但是速度不如我预期的那样。反正有改进的地方吗 问题答案: 使用生成器表达式将您的数据即时划分为多个块,在事务内进行插入。这
以下是logcat中显示的错误。
3 CoreFoundation CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION+28 4 CoreFoundation__CFrunloopdoTimer+880 5 CoreFoundation__CFrunloopdoTimers+276 10 Figment POS AppDelegate.Swift-第39行main+39 11