【问题标题】:Android: Table Row Insert Error. Column does not exist?Android:表格行插入错误。列不存在?
【发布时间】:2014-12-22 08:53:51
【问题描述】:

所以之前我用一个有 2 列的表实现了一个数据库。我改变主意,在表中再添加一列并尝试插入新值,但我遇到了这个问题,即使我正确(我相信)在下面提到的类中添加了所有正确的列声明。

包含列名和数据的 TableData 类:

public class ImageTableData {

    public ImageTableData()
    {

    }
    public static abstract class ImagesTableData implements BaseColumns
    {
        public static final String ImageID = "imid";
        public static final String PID = "pid";
        public static final String URL = "url";
        public static final String DATABASE_NAME = "jezza_db";
        public static final String TABLE_NAME = "product_pics";
    }
}

还有我在 DatabaseOperations 类中的查询:

public String CREATE_IMAGE_QUERY = "CREATE TABLE " + ImagesTableData.TABLE_NAME + " (" + ImagesTableData.ImageID + " VARCHAR, " + ImagesTableData.PID + " VARCHAR, " + ImagesTableData.URL + " VARCHAR);";

我的创建查询执行:

public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_IMAGE_QUERY);
        }

我相信这是两个声明。但是,当我添加一个新列“ImageID”时,我开始收到此错误。之前它只有 2 列时运行良好。

    12-22 14:13:25.345: E/SQLiteLog(21777): (1) table product_pics has no column named imid
    12-22 14:13:25.345: E/SQLiteDatabase(21777): Error inserting pid=77153628 imid=imablack3jpg url=http://storage.googleapis.com/bucketjezza/black3.jpg
    12-22 14:13:25.345: E/SQLiteDatabase(21777): android.database.sqlite.SQLiteException: table product_pics has no column named imid (code 1): , while compiling: INSERT INTO product_pics(pid,imid,url) VALUES (?,?,?)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1121)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:694)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1589)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at function.DBOps.insertImages(DBOps.java:138)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at activity.classes.HomeActivity.commitToDatabase(HomeActivity.java:287)
    12-22 14:13:25.345: E/SQLiteDatabase(21777):    at activity.classes.HomeActivity$2.onSuccess(HomeActivity.java:235)

我的 SELECT 查询也崩溃了,返回了这个错误:

12-22 14:13:25.355: E/SQLiteLog(21777): (1) no such column: ImageID
12-22 14:13:25.355: E/DB ERROR(21777): android.database.sqlite.SQLiteException: no such column: ImageID (code 1): , while compiling: SELECT ImageID FROM product_pics WHERE ImageID=imaimablack3jpg

我的 SELECT 查询和代码块:

public boolean isImageAdded(DBOps dop, String id)
    {
        try
        {
            String idmod = "ima" + id;
            boolean isAdded = false;
            Log.d("URL Recieved: ", id);
            SQLiteDatabase SQ = dop.getReadableDatabase();
            String sqlQuery = "SELECT ImageID FROM "+ ImagesTableData.TABLE_NAME +" WHERE ImageID="+idmod; 
            Cursor cursor = SQ.rawQuery(sqlQuery, null);
            Log.d("Cursor Count : ", String.valueOf(cursor.getCount()));
            if(cursor.getCount() > 0)
            {
                cursor.close();
                isAdded = true;
            }
            else
            {
                cursor.close();
                isAdded = false;
            }
        }
        catch(Exception ex)
        {
            Log.e("DB ERROR", ex.toString());
        }
        return false;
    }

为什么会这样?我已经正确添加了新列,不是吗?请帮忙:)

【问题讨论】:

    标签: java android sql sqlite insert


    【解决方案1】:

    更正您的查询

    String sqlQuery = "SELECT imid FROM "+ ImagesTableData.TABLE_NAME +" WHERE imid ='"+idmod+"'"; 
    

    您的表中没有可用的列名ImageID。你定义了ImageID=imid

    或者其他方式

     String sqlQuery = "SELECT "+ ImagesTableData.ImageID +" FROM "+ ImagesTableData.TABLE_NAME +" WHERE "+ ImagesTableData.ImageID + " = '"+idmod+"'"; 
    

    【讨论】:

    • 这解决了这个问题,但现在应用程序将图像 id 作为列 oO 我现在得到的错误说:“(1)没有这样的列:ima10847010102045632116556882008366137njpg android.database.sqlite.SQLiteException:没有这样的列:ima10847010102045632116556882008366137njpg(代码1):,同时编译:SELECT imid FROM product_pics WHERE imid=ima10847010102045632116556882008366137njpg”。显然没有这样的列:/ 那是图像 id
    • @BenildusRatnayake 然后传递 ImageID。不管是什么。
    • 是的,这就是我要传递的内容,先生。字符串 sqlQuery = "SELECT " + ImagesTableData.ImageID + " FROM "+ ImagesTableData.TABLE_NAME +" WHERE imid="+id; id 是图像 ID。但是错误说它是一列?
    • @BenildusRatnayake 为什么在id 中添加imajpg。直接检查 id 值
    • 我认为长值作为 ID 先生。我的问题是我在 cmets 中发布的错误。你怎么看?
    【解决方案2】:

    卸载应用程序并重新安装,您的问题将得到解决。

    因为只要数据库文件不在应用程序目录中,那么只会调用数据库助手类的onCreate() 方法。如果我们的应用程序目录有可用的数据库文件,它不会调用数据库助手类的onCreate() 方法。如果您重新安装应用程序而不卸载数据库文件,则不会被删除。所以不会执行数据库助手类的onCreate()

    【讨论】:

      【解决方案3】:

      改变你的sql查询

      "SELECT ImageID FROM "+ ImagesTableData.TABLE_NAME
      

      "SELECT " + ImagesTableData.ImageID + " FROM "+ ImagesTableData.TABLE_NAME
      

      【讨论】:

        【解决方案4】:

        您正在尝试检索不存在的字段ImageID

        String sqlQuery = "SELECT ImageID FROM "+  ...
        

        相反,您有一个名为 imid 的字段,定义如下:

        public static final String ImageID = "imid";
        

        所以,正确的查询是:

        String sqlQuery = "SELECT imid FROM "+  ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-13
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 2014-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多