【问题标题】:SQLiteException no such tableSQLiteException 没有这样的表
【发布时间】:2014-09-03 14:59:59
【问题描述】:

刚开始使用 Android,我正在尝试创建一个简单的应用程序,该应用程序具有用于收集姓名和联系电话的 SQLite 数据库。我创建了一个视图活动,它将使用 simpleCursorAdapter 在列表视图中显示内容(是的,它已被贬值,但我还没有介绍使用自定义适配器。无论如何,到目前为止代码编译得很好。当我单击按钮开始时我得到的视图活动

SQLite 异常:没有这样的表:clientTable(代码 1):,编译时:SELECT _id, name, mobile FROM clientTable。

下面是我的数据库类的代码

package com.example.ideahutquizz;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class ClientDatabase extends SQLiteOpenHelper {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_MOBILE = "mobile";

    public static final String DATABASE_NAME = "clientDatabase";
    public static final String TABLE_NAME = "clientTable";
    public static final int DATABASE_VERSION = 1;

    String CREATE_TABLE = "create table"
            + TABLE_NAME + "("
            + KEY_ROWID + "INTEGER PRIMARY KEY AUTOINCREMENT,"
            + KEY_NAME + "TEXT NOT NULL,"
            + KEY_MOBILE + "TEXT NOT NULL" + ")";

    public ClientDatabase(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(CREATE_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }
}

这是视图活动的代码

package com.example.ideahutquizz;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class ViewDataActivity extends ActionBarActivity {

    Button back;
    ListView clientList;
    SQLController clientDB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_data);

        clientList = (ListView)findViewById(R.id.listView1);
        back = (Button)findViewById(R.id.button1);
        clientDB = new SQLController(this);
        clientDB.open();


        Cursor cursor = clientDB.readData();
        String[] from = new String[]{ClientDatabase.KEY_ROWID, ClientDatabase.KEY_NAME, ClientDatabase.KEY_MOBILE};
        int[] to = new int[]{R.id.textView_id, R.id.textView_name, R.id.textView_mobile};

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview_item_row, cursor, from, to);
        adapter.notifyDataSetChanged();
        clientList.setAdapter(adapter);

        back.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                clientDB.close();
                Intent back = new Intent(ViewDataActivity.this, ControlPanel.class);
                startActivity(back);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.view_data, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

非常感谢任何帮助。

更新了....

我将 create table 语句更改如下,但我仍然收到相同的错误...

private static final String CREATE_TABLE = 
        "create table " + TABLE_NAME + "("
        + KEY_ROWID + " integer primary key autoincrement,"
        + KEY_NAME + " text not null,"
        + KEY_MOBILE + " text not null" + ")";

【问题讨论】:

  • 同时卸载您的应用程序,以便在重新创建数据库时onCreate() 中的问题变得明显。 stackoverflow.com/questions/21881992/…
  • 我在 Eclipse 模拟器上运行它。我还需要卸载吗?
  • 是的,在设备或模拟器上运行并没有什么不同。

标签: android-sqlite


【解决方案1】:

表未创建:

    String CREATE_TABLE = "create table"
        + TABLE_NAME + "("

会产生这个字符串:

    String CREATE_TABLE = "create tableclientTable("

创建表后需要加空格:

    String CREATE_TABLE = "create table "
        + TABLE_NAME + "("

字段名称也是如此

所以,最后,字符串将是:

String CREATE_TABLE = "CREATE TABLE " +
    TABLE_NAME + " (" +
    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    KEY_NAME + " TEXT NOT NULL, " +
    KEY_MOBILE + " TEXT NOT NULL" + ")";

【讨论】:

  • 如果我问你是否可以重写整个 CREATE_TABLE 语句会不会太过分了,因为我已经按照你提到的方式进行了修改,但仍然出现错误。
  • 太棒了。现在,如果您接受我的回答,该问题可以从未回答的问题队列中删除。
【解决方案2】:

由于缺少一些空格,您的 CREATE TABLE 语句将失败;

String CREATE_TABLE = "create table"
        + TABLE_NAME + "("
        + KEY_ROWID + "INTEGER PRIMARY KEY AUTOINCREMENT,"
        + KEY_NAME + "TEXT NOT NULL,"
        + KEY_MOBILE + "TEXT NOT NULL" + ")";

...会产生类似

的结果
create tableclientTable(
    _idINTEGER PRIMARY KEY AUTOINCREMENT,
    nameTEXT NOT NULL,
    mobileTEXT NOT NULL)

...这将导致语法错误并且不会创建表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多