【问题标题】:Saving data to SQLite from JSON Android将数据从 JSON Android 保存到 SQLite
【发布时间】:2016-07-07 06:34:21
【问题描述】:

我想从 JSON 网络服务将标题、整数和 url 保存到 SQLite 数据库中。我正在使用代码来执行此操作,并且当我使用另一个 url 时它可以完美地工作,但现在我总是为我想保存的每个 JSON 对象得到这个异常:

E/SQLiteLog:(20) 语句在 6 处中止:[INSERT INTO categories_table(title,imageurl,azon) VALUES (?,?,?)] 数据类型不匹配E/SQLiteDatabase: 插入标题时出错=Tánctanár imageurl=http://80.99.190.2:8080/mobil/download?id=360azon=71 android.database.sqlite.SQLiteDatatypeMismatchException:数据类型不匹配(代码 20)

CTHandler.java:

public class CTHandler extends SQLiteOpenHelper implements CategoriesListener {

private static final int CT_VERSION = 1;
private static final String CT_NAME = "CategoriesDatabase.db";
private static final String TABLE_NAME = "categories_table";
private static final String KEY_TITLE = "title";
private static final String KEY_IMAGEURL = "imageurl";
private static final String KEY_AZON = "azon";

String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+KEY_TITLE+" TEXT,"+KEY_IMAGEURL+" TEXT,"+KEY_AZON+" TEXT)";
String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME;

public CTHandler(Context context) {
    super(context, CT_NAME, null, CT_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_TABLE);
    onCreate(db);
}

@Override
public void addCategories(CategoriesItem citem) {
    SQLiteDatabase db = this.getWritableDatabase();
    try{
        ContentValues values = new ContentValues();
        values.put(KEY_TITLE, citem.getTitle());
        values.put(KEY_IMAGEURL,citem.getImageurl());
        values.put(KEY_AZON,citem.getAzon());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }catch (Exception e){
        Log.e("problem",e+"");
    }
}

@Override
public ArrayList<CategoriesItem> getAllCategories() {
    SQLiteDatabase db = this.getReadableDatabase();
    ArrayList<CategoriesItem> categoriesList = null;
    try{
        categoriesList = new ArrayList<CategoriesItem>();
        String QUERY = "SELECT * FROM "+TABLE_NAME;
        Cursor cursor = db.rawQuery(QUERY, null);
        if(!cursor.isLast())
        {
            while (cursor.moveToNext())
            {
                CategoriesItem ci = new CategoriesItem();
                ci.setTitle(cursor.getString(0));
                ci.setImageurl(cursor.getString(1));
                ci.setAzon(cursor.getString(2));
                categoriesList.add(ci);
            }
        }
        db.close();
    }catch (Exception e){
        Log.e("error",e+"");
    }
    return categoriesList;
}

@Override
public int getCategoriresCount() {
    int num = 0;
    SQLiteDatabase db = this.getReadableDatabase();
    try{
        String QUERY = "SELECT * FROM "+TABLE_NAME;
        Cursor cursor = db.rawQuery(QUERY, null);
        num = cursor.getCount();
        db.close();
        return num;
    }catch (Exception e){
        Log.e("error",e+"");
    }
    return 0;
}

}

我尝试将BOLBINTEGER PRIMARY KEY 用于imageurl,但没有成功。

这是数组中的一个 JSON 对象:

"channel":[{"title":"MENYASSZONYI RUHA","imageurl":"http://80.99.190.2:8080/mobil/download?id=350","azon":53},

这是我要保存的内容,我还希望将图像的 URL 保存为 String。我不喜欢使用 Bitmaps 和 byte[] 我只想像图像的名称一样保存。如果有人知道如何做到这一点,请回复。

【问题讨论】:

  • CTHandler 类中,您将 azon 设置为 Text 类型,但在插入时传递整数。请确保您将 String 传递给该字段。
  • 我应该将INTEGER PRIMARY KEY 用于 azon 吗?我已将 azon 保存为字符串,当我使用 citem.getAzon() 时,它会返回一个字符串。
  • 添加时,您在数据库中为 Azon 使用的内容。

标签: java android json sqlite


【解决方案1】:

错误代码20表示您对数据库进行了一些更改后尚未更新数据库版本。卸载您的应用程序然后再次运行或更新您的数据库版本代码或在卸载应用程序后尝试更改数据库名称..

【讨论】:

  • 感谢您给我写信,但不幸的是它不起作用,我遇到了同样的错误。你还有什么想法吗?
  • 据我所见,错误代码 20 带有数据库存在问题。更改数据库名称或卸载应用程序并重试。这可能会解决您的问题。
  • 谢谢,重命名数据库并卸载应用解决了问题。
【解决方案2】:

要保存图像,您需要使用 BLOB 数据类型。但我不知道保存 URL。

【讨论】:

    【解决方案3】:

    请尝试这样,让我知道它是否有效。

    在执行 .toString(); 之后尝试将所有内容保存到您的数据库中;

    如果它不起作用,您可以尝试以下建议。

    在您的代码中更改它并

    String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME;
    

    用这个替换

     String DROP_TABLE = db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    

    如果没有任何效果,请尝试更改数据库名称并尝试一下!

    希望它会有所帮助。如果它不起作用,请告诉我。

    【讨论】:

    • 感谢您给我写信,但不幸的是,它们都不起作用。你还有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2011-09-11
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2016-07-30
    • 2012-12-16
    相关资源
    最近更新 更多