android.database.sqlite.SQLiteException:表X没有名为Y:的列,同时编译:INSERT INTO

时间:2013-11-29 21:50:37

标签: android sql sqlite

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

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,有一个按钮转到一个Activity来创建一个'Perfil'(用户)[btCrearPerfil] ......还有一个用它来查看listView [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;
    }

}

需要帮助......谢谢...

9 个答案:

答案 0 :(得分:24)

CREATE TABLE声明中缺少空格:

NOMBRE_CORREO + "TEXT NOT NULL);");

应该是

NOMBRE_CORREO + " TEXT NOT NULL);");

答案 1 :(得分:14)

这个问题主要是由语法引起的。例如,以前我的代码是正确的。这是:

    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

答案 2 :(得分:4)

当您在数据库中进行更改但不删除以前的数据库时,会出现此问题。 卸载应用程序然后运行它。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

  

更改方法和增量版本

  

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

  

卸载应用程序 ,因为电话中安装了没有此表的版本,因此找不到该表

  

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

答案 7 :(得分:0)

检查是否有语法错误。如果未发现语法错误,请卸载并重新安装该应用程序。之后一切都应该正常工作。

P.S。我的想法:这种卸载和重新安装确实很烦人。开发人员花了很多时间来查找错误,但最终解决方案是卸载并重新安装。如果您向应用程序添加权限(例如Internet访问权限),也会发生这种情况。这是我发现的第二件事。 Google的Android团队应该对此做些事情。

答案 8 :(得分:0)

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