我的数据库适配器代码如下所示:
package com.quiz.spellingquiz;
import java.io.IOException;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class DBAdapter
{
// Database Operation
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_WORD = "word";
public static final String KEY_SOUND = "sound";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "testing";
public static String DATABASE_TABLE = null;
private static final int DATABASE_VERSION = 1;
public static final String DATABASE_CREATE =
"create table "+DATABASE_TABLE+" (_id integer primary key, "
+ "isbn text not null,"
+ "title text not null,"
+ "word text not null,"
+ "sound text not null,"
+ "publisher text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx, String table_name)
{
this.context = ctx;
DATABASE_TABLE=table_name;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion)
{
Log.w(TAG, "Upgrading database from version "+oldVersion+" to "+newVersion+", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---insert a title into the database---
public long insertTitle(String isbn, String title, String word, String sound, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, isbn);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_WORD, word);
initialValues.put(KEY_SOUND, sound);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular title---
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
public boolean deleteAllTitle()
{
return db.delete(DATABASE_TABLE,null, null)>0;
}
public Cursor getAllTitles()
{
Cursor mCursor = db.query(DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER},
null,
null,
null,
null,
null,
null);
return mCursor;
}
//---retrieves a particular title---
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER
},
KEY_ROWID + "=" + rowId,
null,
null,
null,
null, ////////////////////////////
null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
// to fetch TextFile with Sound file
public Cursor getSound(String str) throws SQLException
{
String file = Environment.getExternalStorageDirectory().getAbsolutePath();
file = file+"/"+str+".3gp";
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER
},
KEY_SOUND + "=" +file,
null,
null,
null,
null,
null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
public void deleteAll()
{
this.db.delete(DATABASE_TABLE, null, null);
}
//---updates a title---
public boolean updateTitle(long rowId, String isbn, String title,String word,String sound, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, isbn);
args.put(KEY_TITLE, title);
args.put(KEY_WORD, word);
args.put(KEY_SOUND, sound);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}现在,在另一个活动中,我用表名创建了DatabaseAdapter对象,如下所示:
final DBAdapter db = new DBAdapter(this,table_name); // create new database with givan table name现在,当我从该对象获取数据时,它给出了如下错误:
android.database.sqlite.SQLiteException: no such table: hello: , while compiling: INSERT INTO hello(word, title, sound, publisher, isbn) VALUES(?, ?, ?, ?, ?);那么,我错在哪里呢?为什么我无法创建表?我应该做些什么?
看,这是我的另一个活动的代码,我在其中调用DBAdapter
// database object
final DBAdapter db = new DBAdapter(this); // create new database with givan table name
showall.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
db.open();
Cursor c = db.getAllTitles();
while(c.moveToNext())
{
Toast.makeText(EnterWordsActivity.this,
"id: " + c.getString(0) + "\n" +
"ISBN: " + c.getString(1) + "\n" +
"TITLE: " + c.getString(2) + "\n" +
"WORD: " + c.getString(3) + "\n" +
"SOUND:" + c.getString(4) +"\n"+
"PUBLISHER: " + c.getString(5),Toast.LENGTH_LONG).show();
}
db.close();
}
});在同一数据库中创建新表后的错误日志。
09-01 15:05:52.608: ERROR/AndroidRuntime(596): FATAL EXCEPTION: main09-01 15:05:52.608:错误/AndroidRuntime(596):android.database.sqlite.SQLiteException:没有这样的表: world:,while compiling: SELECT _id,isbn,title,word,sound,来自世界的发布者09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteCompiledSql.native_compile(Native方法) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:64) 09-01 15:05:52在android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:80) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):在android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:46) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at .608 09-01 15:05:52.608: ERROR/AndroidRuntime(596):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1301) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at com.quiz.spellingquiz.DBAdapter.getAllTitles(DBAdapter.java:119) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at com.quiz.spellingquiz.EnterWordsActivity$1.onClick(EnterWordsActivity.java:86) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.view.View.performClick(View.java:2408) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.view.View$PerformClick.run(View.java:8816) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.os.Handler.handleCallback(Handler.java:587) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.os.Handler.dispatchMessage(Handler.java:92) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.os.Looper.loop(Looper.java:123) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at android.app.ActivityThread.main(ActivityThread.java:4627) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at java.lang.reflect.Method.invokeNative(Native Method) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at java.lang.reflect.Method.invoke(Method.java:521) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 09-01 15:05:52.608: ERROR/AndroidRuntime(596):at dalvik.system.NativeStart.main(本地方法)
发布于 2011-09-01 18:30:13
使用此代码
import java.io.IOException;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class DBAdapter
{
// Database Operation
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_WORD = "word";
public static final String KEY_SOUND = "sound";
public static final String KEY_PUBLISHER = "publisher";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "testing";
public static String DATABASE_TABLE = null;
private static final int DATABASE_VERSION = 1;
public static final String DATABASE_CREATE =
"create table "+DATABASE_TABLE+" (_id integer primary key, "
+ "isbn text not null,"
+ "title text not null,"
+ "word text not null,"
+ "sound text not null,"
+ "publisher text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx, String table_name)
{
this.context = ctx;
DATABASE_TABLE=table_name;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion)
{
Log.w(TAG, "Upgrading database from version "+oldVersion+" to "+newVersion+", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//used to create the the new table
public void createNewTable(String t_name){
this.DATABASE_TABLE=t_name;
db.execSQL(this.DATABASE_CREATE);
}
//---insert a title into the database---
public long insertTitle(String isbn, String title, String word, String sound, String publisher)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ISBN, isbn);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_WORD, word);
initialValues.put(KEY_SOUND, sound);
initialValues.put(KEY_PUBLISHER, publisher);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular title---
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
public boolean deleteAllTitle()
{
return db.delete(DATABASE_TABLE,null, null)>0;
}
public Cursor getAllTitles()
{
Cursor mCursor = db.query(DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER},
null,
null,
null,
null,
null,
null);
return mCursor;
}
//---retrieves a particular title---
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER
},
KEY_ROWID + "=" + rowId,
null,
null,
null,
null, ////////////////////////////
null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
// to fetch TextFile with Sound file
public Cursor getSound(String str) throws SQLException
{
String file = Environment.getExternalStorageDirectory().getAbsolutePath();
file = file+"/"+str+".3gp";
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_ISBN,
KEY_TITLE,
KEY_WORD,
KEY_SOUND,
KEY_PUBLISHER
},
KEY_SOUND + "=" +file,
null,
null,
null,
null,
null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
public void deleteAll()
{
this.db.delete(DATABASE_TABLE, null, null);
}
//---updates a title---
public boolean updateTitle(long rowId, String isbn, String title,String word,String sound, String publisher)
{
ContentValues args = new ContentValues();
args.put(KEY_ISBN, isbn);
args.put(KEY_TITLE, title);
args.put(KEY_WORD, word);
args.put(KEY_SOUND, sound);
args.put(KEY_PUBLISHER, publisher);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}}
在你的活动中
db.open();
db.createNewTable("ur table name");这解决了你的问题
发布于 2011-09-01 16:26:47
我认为这里的问题是您没有为数据库名称声明.db扩展
private static final String DATABASE_NAME = "testing";它应该是
private static final String DATABASE_NAME = "testing.db";这肯定会起作用,因为我试过你的代码。
还有一个变化是这样的
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create table "+DATABASE_TABLE+" (_id integer primary key, "
+ "isbn text not null,"
+ "title text not null,"
+ "word text not null,"
+ "sound text not null,"
+ "publisher text not null);");
}添加上面的代码而不是
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}然后像这样调用这个类,
DBAdapter adapter = new DBAdapter(this,"mytable");发布于 2011-09-01 13:53:58
在开始时,当创建final string DATABASE_CREATE时,string DATABASE_TABLE将是null。因此,每次使用DATABASE_CREATE时,查询是:
DATABASE_CREATE = "create table (_id integer primary key, "
+ "isbn text not null,"
+ "title text not null,"
+ "word text not null,"
+ "sound text not null,"
+ "publisher text not null);"此查询(没有表名)无效。
===更新===
在string DATABASE_CREATE中,将变量DATABASE_TABLE替换为模板名称:
public static final String DATABASE_CREATE =
"create table #table_name# (_id integer primary key, "
+ "isbn text not null,"
+ "title text not null,"
+ "word text not null,"
+ "sound text not null,"
+ "publisher text not null);";并替换onCreate中的模板名称。
@Override
public void onCreate(SQLiteDatabase db)
{
String query = DATABASE_CREATE.replace("#table_name#", DATABASE_TABLE);
db.execSQL(query);
}https://stackoverflow.com/questions/7266481
复制相似问题