我从某个地方复制了一个sqlite使用的示例。他们定义了5列,我将其更改为4列。
相关部分在这里:
private final String DB_NAME = "mcustomerDbName";
private final String TABLE_NAME = "mcustomeTableName";
SQLiteDatabase customersDB = null;
/** Called when the activity is first created. */
..........................................
这是表4列的上下文
private void mFillDbsTable(){
try {
customersDB.execSQL("INSERT INTO " +
TABLE_NAME +
" Values ('ABARTH','500','Abarth','15.3846153846154' );");
customersDB.execSQL("INSERT INTO " + TABLE_NAME + "Values ( 'ABARTH ', 'Grande Punto ', '1.4 T-Jet 155 ', '14.9253731343284 ' );");
customersDB.execSQL("INSERT INTO " + TABLE_NAME + "Values ( 'ALFA ROMEO ', 'MiTo ', '1.4 16v TB 120 ', '16.3934426229508 ');");
customersDB.execSQL("INSERT INTO " + TABLE_NAME + "Values ( 'ALFA ROMEO ', 'MiTo ', '1.3 JTDm 90 ', '22.2222222222222 ');");
customersDB.execSQL("INSERT INTO " + TABLE_NAME + "Values ( 'ALFA ROMEO ', '147 ', '1.6 (120 bhp) ', '12.1951219512195 ');");
customersDB.execSQL("INSERT INTO " + TABLE_NAME + "Values ( 'ALFA ROMEO ', '147 ', '2.0 ', '11.2359550561798 ');");
..........................................
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*setContentView(R.layout.activity_delek);**/
ArrayList<String> results = new ArrayList<String>();
try {
customersDB = this.openOrCreateDatabase( DB_NAME, MODE_PRIVATE, null);
customersDB.execSQL("CREATE TABLE IF NOT EXISTS " +
TABLE_NAME +
" (Name VARCHAR," +
" Street VARCHAR, Block VARCHAR, City VARCHAR);");
mFillDbsTable();
Cursor c = customersDB.rawQuery("SELECT Name, Street, Block, City FROM " +
TABLE_NAME +
" where Name == 'TOYOTA' or Name == 'Yosi' ", null);
if (c != null ) {
if (c.moveToFirst()) {
do {
String name = c.getString(c.getColumnIndex("Name"));
String street = c.getString(c.getColumnIndex("Street"));
String city = c.getString(c.getColumnIndex("City"));
results.add(name + ", " + street + " "+ city );
}while (c.moveToNext());
}
}
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,results));
} catch (SQLiteException se ) {
Log.e(getClass().getSimpleName(), "create/Open the database problem");
} finally {
if (customersDB != null)
customersDB.execSQL("DELETE FROM " + TABLE_NAME);
customersDB.close();
}
我在日志中收到此消息:
10-01 21:59:59.434: I/Database(1067): sqlite returned: error code = 1, msg = table mcustomeTableName has 5 columns but 4 values were supplied.
为什么??我有4列
最佳答案
该表可能已经存在于上一次运行中,没有进行任何更改,但在数据库中仍然有5列(如果不存在,则创建表)。您可以通过从ADP登录到sqllite来验证这一点。在运行应用程序之前,只需删除表即可。
此外,在插入语句中提供一个列列表。无论如何,这都是一个好习惯,因为您的应用程序将对模式更改更加健壮:
"INSERT INTO " + TABLE_NAME + " (Name, Street, Block, City) Values (" ...etc