E / SQLiteLog:(1)靠近“表”:语法错误

时间:2015-09-08 19:27:02

标签: android sql sqlite syntax-error

我正在尝试在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.");
        }

    }
}

3 个答案:

答案 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