奇怪的SQLiteException并非在所有设备中

6 sqlite android exception twitter4j

我有一个按钮,当按下时会在webview中打开twitter登录页面(作为活动).我正在使用twitter4j 2.2.6版.问题是这个 - 当我点击模拟器或我的三星glaxy 2它完全没有任何错误,但当我点击我的三星galaxy 3 GT-I9300(和我的朋友相同的手机)上的按钮,我得到以下例外:

android.database.sqlite.SQLiteException:没有这样的表:password :,同时编译:SELECT用户名,密码来自android.database的android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)的密码FROM密码WHERE(host ==?). sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:68)位于android.database的android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)的android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361). sqlite.SQLiteProgram.(SQLiteProgram.java:127)在android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:94)android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:53)android.database.sqlite. android.database中的SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47).位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525)的android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569)上的sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1684) .sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605)位于Android.os.Handler的android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990)android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589). dispatchMessage(Handler.java:99)在android.we.Looper.loop(Looper.java:137)的android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:950)java.lang.Thread.run(Thread)的.java:856)位于android.dwekit.WebViewDatabase的android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605)的android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525)上的SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569)位于Android.os.Herper.loop(Looper. java:137)在android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:950)java.lang.Thread.run(Thread.java:856)位于android.dwekit.WebViewDatabase的android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605)的android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525)上的SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569)位于Android.os.Herper.loop(Looper. java:137)在android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:950)java.lang.Thread.run(Thread.java:856)1605)android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589)的android.we.Bandser.dispatchMessage(Handler.java:99)安卓android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990). os.Looper.loop(Looper.java:137)位于java.lang.Thread.run(Thread.java:856)的android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:950)1605)android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589)的android.we.Bandser.dispatchMessage(Handler.java:99)安卓android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990). os.Looper.loop(Looper.java:137)位于java.lang.Thread.run(Thread.java:856)的android.webkit.WebViewCore $ WebCoreThread.run(WebViewCore.java:950)

webview是一个活动(扩展Activity)我在崩溃时有足够的空间:

总计 - 12187213824 free- 4315947008

我在崩溃时的配置:

FlipFont=0
compatScreenHeightDp=546
compatScreenWidthDp=320
compatSmallestScreenWidthDp=320
fontScale=0.93
hardKeyboardHidden=HARDKEYBOARDHIDDEN_YES
keyboard=KEYBOARD_NOKEYS
keyboardHidden=KEYBOARDHIDDEN_NO
locale=en_US
mcc=425
mnc=1
navigation=NAVIGATION_NONAV
navigationHidden=NAVIGATIONHIDDEN_YES
orientation=ORIENTATION_PORTRAIT
screenHeightDp=615
screenLayout=SCREENLAYOUT_SIZE_NORMAL+SCREENLAYOUT_LONG_YES
screenWidthDp=360
seq=46
smallestScreenWidthDp=360
textLayoutDirection=0
touchscreen=TOUCHSCREEN_FINGER
uiMode=UI_MODE_TYPE_NORMAL+UI_MODE_NIGHT_NO
userSetLocale=false
Run Code Online (Sandbox Code Playgroud)

设备功能:

android.hardware.wifi
android.hardware.location.network
android.hardware.nfc
android.hardware.location
android.hardware.sensor.gyroscope
android.hardware.screen.landscape
android.hardware.screen.portrait
android.hardware.wifi.direct
android.hardware.usb.accessory
android.hardware.bluetooth
android.hardware.touchscreen.multitouch.distinct
android.hardware.microphone
android.hardware.sensor.light
android.hardware.camera.autofocus
android.software.live_wallpaper
android.hardware.camera.flash
android.hardware.telephony
android.software.sip
android.hardware.touchscreen.multitouch.jazzhand
android.hardware.sensor.barometer
android.hardware.usb.host
android.hardware.touchscreen.multitouch
android.hardware.sensor.compass
android.hardware.faketouch
android.hardware.camera
com.sec.feature.minimode
android.software.sip.voip
android.hardware.sensor.proximity
android.hardware.location.gps
android.hardware.telephony.gsm
android.hardware.camera.front
com.nxp.mifare
android.hardware.touchscreen
android.hardware.sensor.accelerometer
glEsVersion = 2.0
Run Code Online (Sandbox Code Playgroud)

环境:

getAndroidSecureContainerDirectory=/mnt/asec
getCloudStorageDirectory=/mnt/sdcard/cloud
getCloudStorageDirectoryPath=/mnt/sdcard/cloud
getDataDirectory=/data
getDownloadCacheDirectory=/cache
getExternalStorageAndroidDataDir=/mnt/sdcard/Android/data
getExternalStorageDirectory=/mnt/sdcard
getExternalStorageDirectoryUsbHost=/mnt/sdcard/Storages/usb
getExternalStorageState=mounted
getRootDirectory=/system
getSecureDataDirectory=/data
getSystemSecureDirectory=/data/system
isEncryptedFilesystemEnabled=false
isExternalStorageEmulated=true
isExternalStorageRemovable=false
Run Code Online (Sandbox Code Playgroud)

权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
Run Code Online (Sandbox Code Playgroud)

在webview中我没有做任何sqllite交易或没有涉及任何事情.

看到我对这一行的回答

我不是root用户(意思是我有写权限)

涉及webview的代码是:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    try{
                    requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.twitter);
        mIntent = getIntent();
        String url = (String)mIntent.getExtras().get("URL");
        WebView webView = (WebView) findViewById(R.id.webview);

        WebSettings settings = webView.getSettings();

        settings.setDatabaseEnabled(true);
        settings.setDatabasePath("/data/data/"+getPackageName()+"/databases");
        settings.setDomStorageEnabled(true);

        settings.setJavaScriptEnabled(true);
        settings.setAllowFileAccess(true);
        settings.setSaveFormData(true);
        settings.setSavePassword(true);
            webView.setWebViewClient( new WebViewClient()
            {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url)
                {
                    ...
                    return false;
                }
            });
            webView.loadUrl(url);
         }catch(Exception e){
            e.printStackTrace();
         }


    }
    public void onExceededDatabaseQuota(String url, String 
            databaseIdentifier, long currentQuota, long estimatedSize, long 
            totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 

         quotaUpdater.updateQuota(204801); 
    } 
Run Code Online (Sandbox Code Playgroud)

我发现这个链接有一些相似之处:

我已经看了太多线程了很长一段时间,我对此非常沮丧

有没有人有任何想法?谢谢

小智 1

事实证明我在代码的其他地方有这两行:

context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
Run Code Online (Sandbox Code Playgroud)

这条线应该清除我的 webview 的缓存,但这条线只适用于以前的设备,在 Galaxy 3 中,也许还有其他设备,事实证明,webview 启动时不会再次创建此数据库,因此 sqlite 异常是因为确实没有桌子...

需要小心——我写的那行是误导性的:

“在网络视图中,我没有进行任何 sqllite 事务,也没有涉及任何内容”