我尝试使用SQLite支持创建应用程序。
但是当我启动应用程序时,它只是冻结,不得不被迫退出。
Main.java
类:
package se.maxallan.birdsound;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Main extends Activity {
private SpeciesDbAdapter dbHelper;
private SimpleCursorAdapter dataAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dbHelper = new SpeciesDbAdapter(this);
dbHelper.open();
dbHelper.insertSomeSpecies();
displayListView();
}
private void displayListView() {
Cursor cursor = dbHelper.fetchAllSpecies();
String[] columns = new String[]{
SpeciesDbAdapter.DB_SCF_NAME,
SpeciesDbAdapter.DB_T_TRANS
};
int[] to = new int[]{
R.id.scf,
R.id.trans
};
dataAdapter = new SimpleCursorAdapter(this,R.layout.specierow,cursor,columns,to);
ListView listView = (ListView) findViewById(R.id.specieList);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
}
}
我认为错误位于此类中,名为SpeciesDbAdapter.java
。
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;
private static String DB_CREATE =
"CREATE TABLE if not exists species ("+DB_SPECIE_ID +" integer PRIMARY KEY autoincrement, "+DB_SCF_NAME+" , UNIQUE ("+DB_SPECIE_ID +"));" +
"CREATE TABLE if not exists translations (tid integer PRIMARY KEY autoincrement, "+DB_SPECIE_ID +" integer, "+DB_T_TRANS+", "+DB_T_LANG+", UNIQUE ( tid ));";
public SpeciesDbAdapter(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.mCtx = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.w("DATABAS", DB_CREATE);
db.execSQL(DB_CREATE);
}
@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.query(DB_TBL_SPECIES, new String[] {DB_SPECIE_ID, DB_SCF_NAME},null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public void insertSomeSpecies() {
addSpecie("Cygnus olor", "Knölsvan", "sv");
addSpecie("Cygnus cygnus", "Sångsvan", "sv");
}
}
我想我只是误解了一些东西。 而且CatLog根本没有提供任何日志......
答案 0 :(得分:0)
问题是你是从一个变量执行两个create sql语句,试试这个,
String createSpecies = "CREATE TABLE if not exists species ("+DB_SPECIE_ID +" integer PRIMARY KEY autoincrement, "+DB_SCF_NAME+" , UNIQUE ("+DB_SPECIE_ID +"));"
String createTranslations = "CREATE TABLE if not exists translations (tid integer PRIMARY KEY autoincrement, "+DB_SPECIE_ID +" integer, "+DB_T_TRANS+", "+DB_T_LANG+", UNIQUE ( tid ));";
@Override
public void onCreate(SQLiteDatabase db)
{
Log.w("DATABAS", DB_CREATE);
db.execSQL(createSpecies);
db.execSQL(createTranslations);
}
答案 1 :(得分:0)
String[] columns = new String[]{
SpeciesDbAdapter.DB_SCF_NAME,
SpeciesDbAdapter.DB_T_TRANS }
您查询两个表,但columns
应该在一个表中。