【发布时间】:2015-06-21 16:26:15
【问题描述】:
我想在我的 android 应用程序中使用 SQlite 来存储一些数据。尝试运行该应用程序后出现此错误:
06-21 16:14:30.175 2375-2375/snet.app E/SQLiteLog﹕ (1) no such table: tracks.db
06-21 16:14:30.176 2375-2375/snet.app E/SQLiteDatabase﹕ Error inserting title=Goldchains _id=null artist=Marlin album=Filet Mignon - Volume II
android.database.sqlite.SQLiteException: no such table: tracks.db (code 1): , while compiling: INSERT INTO tracks.db(title,_id,artist,album) VALUES (?,?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
at snet.tuberlin.app.DBHandler.addTrack(DBHandler.java:64)
at snet.tuberlin.app.TrackInformations$1.onReceive(TrackInformations.java:91)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我尝试了我在谷歌中找到的所有方法来解决这个问题,包括更改数据库版本。它可以工作,但是在尝试再次运行应用程序后又回到了相同的错误。 这是我的 DBHandler 类:
public class DBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 6;// as you can see i changed the version many time already !!
private static final String DATABASE_NAME = "tracks.db";
public static final String TABLE_TRACKS = "tracks";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_ARTIST = "artist";
public static final String COLUMN_ALBUM = "album";
public static final String COLUMN_LOCATION = "location";
public DBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
final String DATABASE_CREATE = "create table "
+ TABLE_TRACKS + "(" + COLUMN_ID
+ " integer primary key autoincrement, " + COLUMN_TITLE
+ " text not null, " +COLUMN_ARTIST
+ " text not null, " + COLUMN_ALBUM
+ " text not null);";
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TRACKS);
onCreate(db);
}
/*Add new row to the DB*/
public void addTrack(UserTrack usertrack) {
ContentValues values = new ContentValues();
values.put(COLUMN_ID, usertrack.getUserTrackId());
values.put(COLUMN_TITLE, usertrack.getTitle());
values.put(COLUMN_ARTIST, usertrack.getArtist());
values.put(COLUMN_ALBUM, usertrack.getAlbum());
SQLiteDatabase db = getWritableDatabase();
db.insert(DATABASE_NAME, null, values);
db.close();
}
}
【问题讨论】:
-
使用
TABLE_TRACKS(表名)代替DATABASE_NAME(数据库名)在数据库中插入数据