我仍然是Java和Android开发的新手。但在这一部分,我找不到什么是错的。 LogCat返回“没有这样的表:翻译”。
package se.maxallan.birdsound;
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.util.Log;
public class SpeciesDbAdapter extends SQLiteOpenHelper{
public static final String DB_SPECIE_ID = "_id";
public static final String DB_SCF_NAME = "scf_name";
public static final String DB_T_LANG = "lang";
public static final String DB_T_TRANS = "translated";
private static SpeciesDbAdapter mDbHelp;
private static SQLiteDatabase mDb;
private static final String DB_NAME = "database.db";
private static final String DB_TBL_SPECIES = "species";
private static final String DB_TBL_TRANSLATIONS = "translations";
//private static final String DB_TBL_SOUNDS = "sounds";
private static final int DB_VERSION = 1;
private final Context mCtx;
static String createSpecies = "CREATE TABLE if not exists "
+ DB_TBL_SPECIES
+" ("+DB_SPECIE_ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"
+DB_SCF_NAME+");";
static String createTranslations = "CREATE TABLE if not exists "
+ DB_TBL_TRANSLATIONS
+" (tid INTEGER PRIMARY KEY AUTOINCREMENT,"
+DB_SPECIE_ID+","
+DB_T_TRANS+","
+DB_T_LANG+");"; //The error is here?
public SpeciesDbAdapter(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.mCtx = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSpecies);
db.execSQL(createTranslations);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
//Open the database
public SpeciesDbAdapter open() throws SQLException {
mDbHelp = new SpeciesDbAdapter(mCtx);
mDb = mDbHelp.getWritableDatabase();
return this;
}
//Close the connection
public void close() {
if (mDbHelp != null) {
mDbHelp.close();
}
}
public void addSpecie(String scf, String translation, String lang){
ContentValues specieValues = new ContentValues();
ContentValues translationsValues = new ContentValues();
specieValues.put(DB_SCF_NAME, scf);
int LastInsertedId = (int) mDb.insert(DB_TBL_SPECIES, null, specieValues);
translationsValues.put(DB_T_LANG, lang);
translationsValues.put(DB_T_TRANS, translation);
translationsValues.put(DB_SPECIE_ID, LastInsertedId);
mDb.insert(DB_TBL_TRANSLATIONS, null, translationsValues);
}
public Cursor fetchAllSpecies() {
Cursor mCursor = mDb.rawQuery("select * from "+ DB_TBL_SPECIES +" s inner join "+ DB_TBL_TRANSLATIONS +" t on s._id=t._id", null);
Log.d("Database", "Result cursor size " + mCursor.getCount() );
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public void insertSomeSpecies() {
addSpecie("Cygnus olor", "Knölsvan", "sv");
addSpecie("Cygnus cygnus", "Sångsvan", "sv");
}
}
我认为错误是我创建表translations
- 或尝试创建...
答案 0 :(得分:3)
我猜你的应用程序至少只有一个只运行一个表:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSpecies);
}
然后你补充道:
db.execSQL(createTranslations);
OpenHelper不会自动检查中的任何更改。您必须强制重新创建数据库。我认为最简单的方法是增加DB_VERSION
。
private static final int DB_VERSION = 2;
这将运行onUpgrade()
,它应删除现有架构并创建新架构。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DB_TBL_SPECIES);
db.execSQL("DROP TABLE IF EXISTS " + DB_TBL_TRANSLATIONS);
onCreate(db);
}
下次更改架构时,只需更改一个数字(DB_VERSION = 3
),即可构建新表格。
答案 1 :(得分:2)
从终端删除您的数据库
adb shell
cd /data/data/com.example.apploicationname/databases
rm *
我认为这也可以帮助您而不是更改DB_VERSION