【问题标题】:java.lang.IllegalArgumentException: class android.database.sqlite.SQLiteDatabase declares multiple JSON fields named mLockjava.lang.IllegalArgumentException:类 android.database.sqlite.SQLiteDatabase 声明了多个名为 mLock 的 JSON 字段
【发布时间】:2012-05-09 19:55:34
【问题描述】:

我在使用 GSON 时遇到问题。

首先,每当我切换活动时,我都会尝试使用 GSON 将对象保存在 SharedPreferences 中。然后我的计划是在我回到活动后再次获取该对象,以便我可以在该页面上重新填充捕获的数据。但是,我的问题是我的 onPause 方法发生了错误。这个错误已经困扰我2天了,希望大家帮忙。我真的需要它。

这是我的 onPause 和 onResume 代码:

    @Override
protected void onPause() {
    super.onPause();

    try {
        SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        Editor prefsEditor = appSharedPrefs.edit();

        activityDataContainer = convertDataContainers(); //This just gets the data from the page

        prefsEditor.putInt("objectLength", activityDataContainer.size());
        Gson gson = new Gson();
        for(int x = 0; x < activityDataContainer.size(); x++){
            ConnectionObject temp = activityDataContainer.get(x);
            String json = gson.toJson(temp);
            prefsEditor.putString("connectionData"+x, json);
        }

        prefsEditor.commit();
        Toast.makeText(this, "Object stored in SharedPreferences", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this, ""+e, Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

};

@Override
protected void onResume() {
    super.onResume();

    //===== Using SharedPreferences
    SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
    if(appSharedPrefs.contains("objectLength")){

        int length = appSharedPrefs.getInt("objectLength", 0);
        activityDataContainer = new ArrayList<ConnectionObject>();
        Gson gson = new Gson();
        for(int x = 0; x < length; x++){
            String json = appSharedPrefs.getString("connectionData"+x, "");
            ConnectionObject object = gson.fromJson(json, ConnectionObject.class);
            activityDataContainer.add(object);
        }

        revertDataContainers(activityDataContainer); //Repopulates the data
        Toast.makeText(this, "Object retrieved in SharedPreferences", Toast.LENGTH_SHORT).show();
    }
}

这是我得到的错误日志:

05-10 02:14:47.822:E/AndroidRuntime(31718):致命异常:主要 05-10 02:14:47.822: E/AndroidRuntime(31718): java.lang.RuntimeException: 无法暂停活动 {com.NelConsulting.FieldCaptureTool/com.MyClass}: java.lang.IllegalArgumentException: class android.database.sqlite .SQLiteDatabase 声明多个名为 mLock 的 JSON 字段 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:2354) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:2311) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2291) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.access$1700(ActivityThread.java:117) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:938) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.os.Handler.dispatchMessage(Handler.java:99) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.os.Looper.loop(Looper.java:130) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 java.lang.reflect.Method.invoke(Method.java:507) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 05-10 02:14:47.822: E/AndroidRuntime(31718): at dalvik.system.NativeStart.main(Native Method) 05-10 02:14:47.822: E/AndroidRuntime(31718): Caused by: java.lang.IllegalArgumentException: class android.database.sqlite.SQLiteDatabase 声明了多个名为 mLock 的 JSON 字段 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.getAdapter(Gson.java:349) 05-10 02:14:47.822: E/AndroidRuntime(31718): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.getAdapter(Gson.java:349) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:52) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.getAdapter(Gson.java:349) 05-10 02:14:47.822: E/AndroidRuntime(31718): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.getAdapter(Gson.java:349) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.toJson(Gson.java:582) 05-10 02:14:47.822: E/AndroidRuntime(31718): at com.google.gson.Gson.toJson(Gson.java:561) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.toJson(Gson.java:516) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.google.gson.Gson.toJson(Gson.java:496) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 com.MyClass.onPause(ConnectionsActivity.java:804) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.Activity.performPause(Activity.java:3851) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1191) 05-10 02:14:47.822: E/AndroidRuntime(31718): 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:2341)

我们将不胜感激所有帮助。非常感谢。

**编辑 **ConnectionObject 是一个存储这些值的简单对象:

private boolean toggleButtonValue;
private int sdGenValue;
private int sdSpecValue;
private int sdCountValue;
private String sdLengthValue;
private int sdCondValue;
private int sdOwnValue;
private String sdDateValue;
private String mLtValue;
private String mLgValue;
private String mAcValue;
private int mPhotoValue;
private List<MeterObject> meterContainer;

【问题讨论】:

  • ConnectionObject 长什么样子?看起来那里有一个 android.database.sqlite.SQLiteDatabase 类型的字段,您很可能不希望,绝对不应该而且显然不能用 Gson 序列化。
  • MeterObject 中有什么内容?从堆栈跟踪中的Gson.getAdapter() 调用判断,从MeterObject 向下的另外2-3 个对象在某处有一个非瞬态android.database.sqlite.SQLiteDatabase 字段。

标签: android sqlite sharedpreferences gson illegalargumentexception


【解决方案1】:

我解决了它,虽然我认为它只是一个想法的循环。我只是将我的对象分成两部分。第一个是 String 和 int 值,第二个是列表。我分别存储了这两个部分,然后在简历中再次组合它们。感谢您的想法。帮了大忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2019-08-23
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2013-05-13
    • 2017-12-11
    相关资源
    最近更新 更多