java SQLite 错误代码 = 1

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12010235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 07:15:38  来源:igfitidea点击:

SQLite error code = 1

javaandroiddatabasesqlite

提问by Eric Oboite

I'm trying to insert some data into my SQLite database. But I keeo receiving an error code 1 saying that my column does not exist. Can someone help me please, Below is my code:

我正在尝试将一些数据插入到我的 SQLite 数据库中。但是我 keeo 收到错误代码 1,说我的专栏不存在。有人可以帮我吗,下面是我的代码:

08-17 13:12:46.473: I/Database(13328): sqlite returned: error code = 1, msg = table login has no column named uid
08-17 13:12:46.503: E/Database(13328): Error inserting uid=502e7b90657ab1.86949026 created_at=2012-08-17 12:12:48 email=epaas name=hwheuu
08-17 13:12:46.503: E/Database(13328): android.database.sqlite.SQLiteException: table login has no column named uid: , while compiling: INSERT INTO login(uid, created_at, email, name) VALUES(?, ?, ?, ?);
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1231)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1658)
08-17 13:12:46.503: E/Database(13328):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1515)
08-17 13:12:46.503: E/Database(13328):  at library.DatabaseHandler.addUser(DatabaseHandler.java:69)
08-17 13:12:46.503: E/Database(13328):  at com.thryfting.www.RegisterActivity$register.doInBackground(RegisterActivity.java:135)
08-17 13:12:46.503: E/Database(13328):  at com.thryfting.www.RegisterActivity$register.doInBackground(RegisterActivity.java:1)
08-17 13:12:46.503: E/Database(13328):  at android.os.AsyncTask.call(AsyncTask.java:185)
08-17 13:12:46.503: E/Database(13328):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-17 13:12:46.503: E/Database(13328):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-17 13:12:46.503: E/Database(13328):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-17 13:12:46.503: E/Database(13328):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-17 13:12:46.503: E/Database(13328):  at java.lang.Thread.run(Thread.java:1027)

Below is my database code:

下面是我的数据库代码:

package library;

import java.util.HashMap;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "thryfting_api";

    // Login table name
    private static final String TABLE_LOGIN = "login";

    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_UID = "uid";
    private static final String KEY_CREATED_AT = "created_at";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_NAME + " TEXT,"
                + KEY_EMAIL + " TEXT UNIQUE,"
                + KEY_UID + " INTEGER,"
                + KEY_CREATED_AT + " TEXT" + ")";
        db.execSQL(CREATE_LOGIN_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);

        // Create tables again
        onCreate(db);
    }

    /**
     * Storing user details in database
     * */
    public void addUser(String name, String email, String uid, String created_at) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, name); // Name
        values.put(KEY_EMAIL, email); // Email
        values.put(KEY_UID, uid); // Email
        values.put(KEY_CREATED_AT, created_at); // Created At

        // Inserting Row
        db.insert(TABLE_LOGIN, null, values);
        db.close(); // Closing database connection
    }

    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("name", cursor.getString(1));
            user.put("email", cursor.getString(2));
            user.put("uid", cursor.getString(3));
            user.put("created_at", cursor.getString(4));
        }
        cursor.close();
        db.close();
        // return user
        return user;
    }

    /**
     * Getting user login status
     * return true if rows are there in table
     * */
    public int getRowCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int rowCount = cursor.getCount();
        db.close();
        cursor.close();

        // return row count
        return rowCount;
    }

    /**
     * Re crate database
     * Delete all tables and create them again
     * */
    public void resetTables(){
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_LOGIN, null, null);
        db.close();
    }

}

回答by zapl

the error message

错误信息

table loginhas no column named uid

login没有名为的列uid

indicates that your database is not in the state you expect it. You do create that table with a column named uid(KEY_UID) but you have most likely added that column after the database was already created on your device. Once it is created it will persist until you explicitly delete that file or uninstall your app. And onCreatewill not be executed again until the database file is missing.

表示您的数据库未处于您期望的状态。您确实使用名为uid( KEY_UID)的列创建了该表,但很可能是在您的设备上创建了数据库之后添加了该列。一旦创建,它将一直存在,直到您明确删除该文件或卸载您的应用程序。并且onCreate在数据库文件丢失之前不会再次执行。

What you need to do is to upgrade the database version each time you change the table definitions. That will trigger the onUpgradecode which will then recreate your table the way you defined it.

您需要做的是每次更改表定义时升级数据库版本。这将触发onUpgrade代码,然后该代码将按照您定义的方式重新创建您的表。

Your fix is most likely just

您的修复很可能只是

private static final int DATABASE_VERSION = 2;

回答by Remi

Try with

试试

private static final String KEY_ID = "uid";

instead of

代替

private static final String KEY_ID = "id";