【问题标题】:android.database.sqlite.SQLiteException: table X has no column named Y: , while compiling: INSERT INTOandroid.database.sqlite.SQLiteException: 表 X 没有名为 Y: 的列,编译时:INSERT INTO
【发布时间】:2013-11-29 21:50:37
【问题描述】:

这是我在控制台中的错误:

11-29 19:06:50.295: E/AndroidRuntime(333): android.database.sqlite.SQLiteException: table usuarios has no column named email: , while compiling: INSERT INTO usuarios(username, organizacion, email) VALUES(?, ?, ?);

这是 mainActivity,带有一个用于创建“Perfil”(用户)[btCrearPerfil] 的 Activity 的按钮...和一个用于查看列表视图的按钮 [btEditarPerfil]...

public class MainActivity extends Activity implements OnClickListener {

    public static ArrayList<Perfil> lstPerfiles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lstPerfiles = new ArrayList<Perfil>();

        Button btCrearPerfil = (Button) findViewById(R.id.btCrearPerfil);
        btCrearPerfil.setOnClickListener(this);
        Button btEditarPerfil = (Button) findViewById(R.id.btEditarPerfil);
        btEditarPerfil.setOnClickListener(this);

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        Intent i;

        switch(v.getId()) {
            case R.id.btCrearPerfil:

                i = new Intent(MainActivity.this, CrearPerfil.class);
                startActivity(i);

                break;

            case R.id.btEditarPerfil:

                i = new Intent(MainActivity.this, ListaPerfiles.class);
                startActivity(i);

                break;

            default: break;
        }
    }

}

这是 Perfil 的创建者,由 btCrearPerfil 输入:

public class CrearPerfil extends Activity implements OnClickListener {

private Database datos;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_crear_perfil);

    datos = new Database(this);

    Button btGuardarPerfil = (Button) findViewById(R.id.btGuardarPerfil);
    btGuardarPerfil.setOnClickListener(this);
    Button btCancelar = (Button) findViewById(R.id.btCancelarPerfil);
    btCancelar.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.crear_perfil, menu);
    return true;
}

@Override
public void onClick(View v) {

    Intent i;

    switch (v.getId()){

        case R.id.btGuardarPerfil:



            EditText eNombre = (EditText) findViewById(R.id.txtUsername);
            EditText eOrganizacion = (EditText) findViewById(R.id.txtOrganizacion);
            EditText eCorreo = (EditText) findViewById(R.id.txtCorreo);
            CheckBox eFavorito = (CheckBox) findViewById(R.id.cbFavorito);

            if ((eNombre.equals("")) || (eOrganizacion.equals("")) || (eCorreo.equals(""))){
                Toast.makeText(getApplicationContext(), "Rellena los campos", Toast.LENGTH_SHORT).show();
            } else {

                datos.nuevoPerfil(eNombre.getText().toString(), 
                        eOrganizacion.getText().toString(), eCorreo.getText().toString());


                Perfil p = new Perfil();
                p.setUsername(eNombre.getText().toString());
                p.setOrganizacion(eOrganizacion.getText().toString());
                p.setCorreo(eCorreo.getText().toString());
                p.setFavorito(eFavorito.isChecked());

                MainActivity.lstPerfiles.add(p);

                eNombre.setText("");
                eOrganizacion.setText("");
                eCorreo.setText("");

                Toast.makeText(getApplicationContext(), "Perfil guardado", Toast.LENGTH_SHORT).show();

                i = new Intent(CrearPerfil.this, MainActivity.class);
                startActivity(i);
            }

            break;

        case R.id.btCancelarPerfil:

            i = new Intent(CrearPerfil.this, MainActivity.class);
            startActivity(i);

            break;

        default: break;
    }
}

}

还有这个,SQLite 创建者的数据库...

public class Database extends SQLiteOpenHelper {

    private static final String BBDD_NOMBRE = "baseDatos.db";
    private static String[] FROM_CURSOR = {_ID, NOMBRE_USUARIO, NOMBRE_ORGANIZACION, NOMBRE_CORREO };
    private static String ORDER_BY = NOMBRE_USUARIO + " DESC";

    public Database(Context contexto) {
        super(contexto, BBDD_NOMBRE, null, 1 );
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLA_USUARIOS + "("
                + _ID+" INTEGER PRIMARY KEY AUTOINCREMENT, " 
                + NOMBRE_USUARIO + " TEXT NOT NULL, " 
                + NOMBRE_ORGANIZACION + " TEXT NOT NULL, "
                + NOMBRE_CORREO + "TEXT NOT NULL);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int a, int b) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLA_USUARIOS);
        onCreate(db);
    }

    public void nuevoPerfil(String n, String o, String c){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues value = new ContentValues();
        value.put(NOMBRE_USUARIO, n);
        value.put(NOMBRE_ORGANIZACION, o);
        value.put(NOMBRE_CORREO, c);
        db.insertOrThrow(TABLA_USUARIOS, null, value);
    }

    public Cursor getPerfiles() {

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query(TABLA_USUARIOS, FROM_CURSOR, null, null, null, null, ORDER_BY);

        return c;
    }

}

需要帮助..谢谢...

【问题讨论】:

  • 是否有可能您最初执行时没有添加“电子邮件”列?如果是这样,您可能需要清除数据,以便可以再次创建数据库。创建过程只在第一次执行时发生,如果数据库版本发生变化,它可以获得更新,这会转到 onUpgrade 方法。
  • 很明显,您的数据库表中没有名为email 的列。在执行任何查询之前验证您的数据库架构和列名。
  • 所以,我下载了数据库并查看电子邮件的创建方式类似于“emailTEXT Type:Nothing”...但是不,我如何调用 onUpgrade 方法...?因为我已经创建了它,但我执行了它并且看起来同样的错误......

标签: android sql sqlite


【解决方案1】:

您的CREATE TABLE 语句中缺少一个空格:

NOMBRE_CORREO + "TEXT NOT NULL);");

应该是

NOMBRE_CORREO + " TEXT NOT NULL);");

【讨论】:

  • 在我的情况下,我错过了一个逗号,这花了我两个小时,发生了愚蠢的错误,我认为这就是存在 android Room ORM 的原因。
【解决方案2】:

这个问题主要是语法造成的。例如,以前我的代码是正确的。在这里:

    String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + TABLE_PRODUCTS + "("
                    + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_MESSAGEADDRESS
                    + " TEXT," + COLUMN_MESSAGEBODY + " TEXT " + ")";

上面的代码运行正确,但我添加了另一列,它开始导致上述错误。以下是错误代码:

    String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + TABLE_PRODUCTS + "("
                    + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_MESSAGEADDRESS
                    + " TEXT," + COLUMN_MESSAGEBODY + " TEXT" + COLUMN_MESSAGETIME + " LONG" + ")";

如您所见,当我添加新列时,我忘记在输入 TEXT 后添加逗号。这意味着当执行这段代码时,会出现语法错误,因为编译器会将最后一部分读取为:

    COLUMN_MESSAGEBODY TEXTCOLUMN_MESSAGETIME LONG

相对于:

    COLUMN_MESSAGEBODY TEXT, COLUMN_MESSAGETIME LONG

解决方案:确保语法正确,注意空格和逗号。

请查看以下链接了解更多信息: Android : Table has no column named "variable name" MySql Database error

【讨论】:

    【解决方案3】:

    这个问题主要发生在你对数据库进行了更改但没有删除之前的数据库时。 卸载该应用程序,然后运行它。

    【讨论】:

    • 你是救生员。谢谢。我其实也是这么想的,但不知怎的,我以为我的桌子是空的! (我知道 - 白痴我哈哈)..
    • 乐于助人。
    【解决方案4】:

    您可以像这样指定版本: private static final int VERSION = 4;

    【讨论】:

      【解决方案5】:

      卸载应用程序,然后重新安装,因为它可以通过两种方法解决,一种是使用

      改变方法和增加版本

      通过重新安装应用程序再次创建表

      【讨论】:

        【解决方案6】:

        正如@joeabala 上面提到的,很多时候这个问题是由语法引起的,比如你忘记了空格或逗号,但是如果你检查它没有问题但你仍然遇到问题,也许你需要卸载应用程序虚拟设备并重新启动它可能会对您有所帮助

        【讨论】:

          【解决方案7】:

          卸载应用,因为手机中安装的版本没有这个表,所以找不到这个表

          提高数据库版本,它将使用新创建的表更新数据库。

          【讨论】:

            【解决方案8】:

            检查您是否有任何语法错误。如果没有发现语法错误,只需卸载并重新安装应用程序。之后一切正常。

            附:我的想法:这种卸载和重新安装真的很烦人。开发人员花了很多时间来寻找错误,但最终解决方案是卸载并重新安装。如果您向应用添加权限(例如 Internet 访问权限),也会发生这种情况。这个数据库的东西是我发现的第二个这样的东西。 Google 的 Android 团队应该对此有所作为。

            【讨论】:

              【解决方案9】:

              您可以像这样更新版本: private static final int VERSION = 4; 要么 确保您已创建正确的表。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-26
                相关资源
                最近更新 更多