这是我在控制台中的错误:
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;
}
}
需要帮助......谢谢...
答案 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; 要么 确保您创建了正确的表。