2014-09-02 89 views
0

刚刚开始在Android上,我试图创建一个简单的应用程序,它具有用于收集姓名和联系人号码的SQLite数据库。我创建了一个视图活动,它将使用simpleCursorAdapter在列表视图中显示内容(是的,它的折旧,但我还没有涉及使用自定义适配器。无论如何,到目前为止,代码编译就好了。当我点击按钮开始视图活动我得到一个SQLiteException没有这样的表

SQLite的例外:没有这样的表:clientTable(代码1):在编译:选择_id,姓名,手机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" + ")"; 
+0

还要卸载您的应用程序,以便在重新创建数据库时'onCreate()'中的问题变得明显。 http://stackoverflow.com/questions/21881992/when-is-sqliteopenhelper-oncreate-onupgrade-run – laalto 2014-09-02 19:25:09

+0

我在eclipse模拟器上运行这个。我仍然需要卸载吗? – 2014-09-03 01:51:14

+0

是的,在设备或模拟器上运行并没有什么区别。 – laalto 2014-09-03 04:48:16

回答

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" + ")"; 
+0

如果我问你是否可以重新编写整个CREATE_TABLE语句,这是否太多了,因为我按照前面提到的那样进行了修改,但仍然收到错误消息。 – 2014-09-02 19:17:51

+0

编辑我的答案 – 2014-09-03 07:00:11

+0

感谢它的工作。 – 2014-09-03 07:01:17

1

你的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) 

...这将导致一个语法错误,而不是创建表。

相关问题