我正在尝试在Android中使用SQLite,但我遇到了一些问题。
我从2012年编写的教程中获取了代码,但它现在不适合我,并向我显示了这个错误:
E / SQLiteLog:(1)“Table”附近:语法错误
问题在于创建/打开数据库。
package db.com.example.kids1.databasetest;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends ListActivity{
private final String DB_NAME = "Database";
private final String TABLE_NAME = "Table";
SQLiteDatabase DB = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> results = new ArrayList<>();
String[] res = {"Red", "Green", "Text"};
try {
DB = this.openOrCreateDatabase(DB_NAME, MODE_PRIVATE, null);
DB.execSQL("CREATE TABLE IF NOT EXISTS " +
TABLE_NAME +
"(Name VARCHAR, Street VARCHAR, Block INT, City VARCHAR, Tel VARCHAR);");
mFillDbsTable();
Cursor c = DB.rawQuery("SELECT Name, Street, Block, City, Tel FROM " +
TABLE_NAME +
" where Blcok == 9 LIMIT 5", null);
if (c!=null){
if (c.moveToFirst()) {
do {
String name = c.getString(c.getColumnIndex("Name"));
String street = c.getString(c.getColumnIndex("Street"));
int block = c.getInt(c.getColumnIndex("Block"));
String city = c.getString(c.getColumnIndex("City"));
String tel = c.getString(c.getColumnIndex("Tel"));
results.add(name + "," + street + "," + block + "," + city + "," + tel);
} while (c.moveToNext());
}
}
ListView list = (ListView)findViewById(android.R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, res);
list.setAdapter(adapter);
} catch (SQLiteException se){
Log.e(getClass().getSimpleName(), "Create/Open Database Problem.");
}
}
private void mFillDbsTable(){
try {
DB.execSQL("INSERT INTO " +
TABLE_NAME +
" Values('Noam', 'Shkolnik', 9, 'Rehovot', '054-4900807');");
DB.execSQL("INSERT INTO " +
TABLE_NAME +
" Values('Eyal', 'Shkolnik', 9, 'Rehovot', '055-4488779');");
DB.execSQL("INSERT INTO " +
TABLE_NAME +
" Values('Yehontan', 'Shkolnik', 9, 'Rehovot', '058-7789547');");
} catch (SQLiteException se) {
Log.e(getClass().getSimpleName(), "Could not create records.");
}
}
}
答案 0 :(得分:1)
private final String TABLE_NAME = "Table"
您无法创建名为Table
的表格,因为它是保留的关键字。
您最好创建一个名为MyTable
的表格(或_Table
或更好地提供更健谈的名称,例如Persons
- 请注意复数的 s 。
所以:
private final String TABLE_NAME = "MyTable"
供参考:https://sqlite.org/lang_keywords.html
你可以(但不推荐)使用保留关键字,但每次引用该表时都必须使用特殊分隔符。
像
这样的东西private final String TABLE_NAME = "[Table]"
您的查询中还有另一个(双重)错误:
" where Blcok == 9 LIMIT 5"
应该是
" where Block = 9 LIMIT 5"
答案 1 :(得分:0)
尝试VARCHAR(100)
并删除尾随的;
答案 2 :(得分:0)
你有几个错误。首先,不要为您的表Table
命名。表是保留字(see docs),不能直接使用。基本上不建议使用保留字,所以我建议你更改你的表名,但如果你坚持使用它,你需要先引用它:
如果您想使用关键字作为名称,则需要引用它。 SQLite中有四种引用关键字的方法:
'keyword'单引号中的关键字是字符串文字。
“keyword”双引号中的关键字是标识符。
[keyword] A 括在方括号中的关键字是一个标识符。这不是 标准SQL。 MS Access和SQL使用此引用机制 服务器并包含在SQLite中以实现兼容性。
keyword
A 用严重重音符号(ASCII代码96)括起来的关键字是一个标识符。 这不是标准的SQL。这种引用机制由MySQL和 SQLite中包含了兼容性。
BTW:由于where子句中的拼写错误,您的进一步select
查询也会失败:
where Blcok == 9