Java 从JSON Android将数据保存到SQLite

Java 从JSON Android将数据保存到SQLite,java,android,json,sqlite,Java,Android,Json,Sqlite,我想将标题、整数和url从JSON Web服务保存到SQLite数据库中。我正在使用一个代码来实现这一点,当我使用另一个url时,它可以完美地工作,但现在对于我要保存的每个JSON对象,我都会遇到以下异常: E/SQLiteLog:(20)语句在6处中止:[插入到categories_表(title,imageurl,azon)值(?,?)]数据类型不匹配/SQLiteDatabase: 插入title=TÃnctanÃr imageurl=azon=71 android.database.sq

我想将标题、整数和url从JSON Web服务保存到SQLite数据库中。我正在使用一个代码来实现这一点,当我使用另一个url时,它可以完美地工作,但现在对于我要保存的每个JSON对象,我都会遇到以下异常:

E/SQLiteLog:(20)语句在6处中止:[插入到categories_表(title,imageurl,azon)值(?,?)]数据类型不匹配/SQLiteDatabase: 插入title=TÃnctanÃr imageurl=azon=71 android.database.sqlite.SQLiteDataTypeMissitchException时出错:数据类型不匹配(代码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;
}

这就是我想保存的内容,我还希望图像的URL将另存为
String
。我不喜欢使用位图和byte[],我只想将其保存为图像的名称。如果有人知道怎么做,请回复。

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

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

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

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

如果它不起作用,你可以尝试下面的建议

在代码中更改此选项,然后

String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME;
换成这个

 String DROP_TABLE = db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
如果没有任何效果,请尝试更改数据库名称一次,然后再试一次


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

请像这样尝试,并告诉我它是否起作用

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

如果它不起作用,你可以尝试下面的建议

在代码中更改此选项,然后

String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME;
换成这个

 String DROP_TABLE = db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
如果没有任何效果,请尝试更改数据库名称一次,然后再试一次


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

错误代码20表示您在对数据库进行某些更改后没有更新数据库版本。请卸载您的应用,然后再次运行或更新数据库版本代码,或在卸载应用后尝试更改数据库名称。

错误代码20表示您没有更新数据库版本在数据库中进行某些更改后更改数据库版本。卸载应用程序,然后再次运行或更新数据库版本代码,或在卸载应用程序后尝试更改数据库名称。

CTHandler
类中,将azon设置为
Text
类型,但在插入时传递整数。请确保您正在将
字符串
传递到该字段。我是否应该为azon使用
整型主键
?我已将azon保存为字符串,当我使用
citem.getAzon()
时,它将返回一个字符串。添加时,您在数据库中使用azon的内容。在
CTHandler
类中,您将azon设置为
Text
类型,但在插入时传递整数。请确保您正在将
字符串
传递到该字段。我是否应该为azon使用
整型主键
?我已将azon保存为字符串,当我使用
citem.getAzon()
时,它会返回一个字符串。添加时,您在数据库中使用azon的内容。感谢您给我写信,但不幸的是,其中没有一个有效。你还有其他想法吗?谢谢你给我写信,但不幸的是,没有一个是有效的。你还有其他想法吗?谢谢你给我写信,但不幸的是它不起作用,我也犯了同样的错误。你们还有其他想法吗?据我所知,错误代码20伴随着数据库存在问题。请更改数据库名称或卸载应用程序,然后重试。。这可能会解决你的问题。谢谢,重命名数据库和unistall应用程序解决了问题。谢谢你写信给我,但不幸的是它不起作用,我收到了相同的错误。你们还有其他想法吗?据我所知,错误代码20伴随着数据库存在问题。请更改数据库名称或卸载应用程序,然后重试。。这可能会解决您的问题。谢谢,重命名数据库和unistall应用程序解决了问题。