Android数据库 android.database.sqlite.SQLiteException:

一直说 no such table: playlistTbl,怎么回事....

public class AppDBHelp extends SQLiteOpenHelper {

    /**
     * 表名
     */
    public static final String TBL_NAME = "playlistTbl";
    /**
     * 建表语句
     */
    public static final String CREATE_TBL = "create table " + TBL_NAME + " ("
            + "_id integer,"
            + "id integer,"
            + "songName text,"
            + "songSinger text,"
            + "album text,"
            + "albumId long,"
            + "displayName text,"
            + "duration long,"
            + "size long,"
            + "path text)";

    public AppDBHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL(CREATE_TBL);
        } catch (SQLException e) {
            LogUtils.i("error", "create table failed");
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        try {
            db.execSQL("drop table if exists " + TBL_NAME);
        } catch (SQLException e) {
            LogUtils.i("error", "create table failed");
        }
        onCreate(db);
    }
}
public class AppDB {

    private static final int AppDBVersion = 1;
    private static AppDB songDB;

    private SQLiteDatabase db;

    /**
     * 构造方法私有化
     */
    private AppDB(Context context) {
        AppDBHelp appDBHelp = new AppDBHelp(context, AppConstant.AppDB_NAME, null, AppDBVersion);
        db = appDBHelp.getWritableDatabase();
    }

    /**
     * 获取SongDB实例
     */
    public synchronized static AppDB getInstance(Context context) {
        if (songDB == null) {
            songDB = new AppDB(context);
        }
        return songDB;
    }

    /**
     * 将SongDetails实例存储到数据库
     *
     * @param details
     */
    public void addSongInfo(SongDetails details) {
        if (details != null) {
            ContentValues values = new ContentValues();
            values.put("_id", details.get_id());
            values.put("id", details.getId());
            values.put("songName", details.getSongName());
            values.put("songSinger", details.getSongSinger());
            values.put("album", details.getAlbum());
            values.put("albumId", details.getAlbumId());
            values.put("displayName", details.getDisplayName());
            values.put("duration", details.getDuration());
            values.put("size", details.getSize());
            values.put("path", details.getPath());
            db.insert(AppDBHelp.TBL_NAME, null, values);
        }
    }

    /**
     * 从数据库加载Song信息
     */
    public List<SongDetails> loadSongDetails() {
        List<SongDetails> list = new ArrayList<SongDetails>();
        Cursor cursor = db.query(AppDBHelp.TBL_NAME, null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                SongDetails details = new SongDetails();
                details.set_id(cursor.getInt(cursor.getColumnIndex("_id")));
                details.setId(cursor.getInt(cursor.getColumnIndex("id")));
                details.setSongName(cursor.getString(cursor.getColumnIndex("songName")));
                details.setSongSinger(cursor.getString(cursor.getColumnIndex("songSinger")));
                details.setAlbumId(cursor.getLong(cursor.getColumnIndex("albumId")));
                details.setDisplayName(cursor.getString(cursor.getColumnIndex("displayName")));
                details.setDuration(cursor.getLong(cursor.getColumnIndex("duration")));
                details.setSize(cursor.getLong(cursor.getColumnIndex("size")));
                details.setPath(cursor.getString(cursor.getColumnIndex("path")));
                list.add(details);
            } while (cursor.moveToNext());
        }
        return list;
    }
}

实体类

public class SongDetails implements Serializable {
    private int _id;
    //    歌曲Id
    private int id;
    //    歌曲名称
    private String songName;
    //    歌手名称
    private String songSinger;
    //    专辑
    private String album;
    //    专辑Id
    private long albumId;
    //    显示名称
    private String displayName;
    //    歌曲时长
    private long duration;
    //    歌曲大小
    private long size;
    //    歌曲路径
    private String path;

错误信息

12-05 01:28:53.008 20834-21026/? E/SQLiteDatabase: Error inserting id=69441 duration=0 albumId=24 _id=183 album=download songSinger=<unknown> path=/storage/sdcard0/kgmusic/download/张敬轩 - 追风筝的孩子.ape songName=张敬轩 - 追风筝的孩子 displayName=张敬轩 - 追风筝的孩子.ape size=30158672
                                                   android.database.sqlite.SQLiteException: no such table: playlistTbl (code 1): , while compiling: INSERT INTO playlistTbl(id,duration,albumId,_id,album,songSinger,path,songName,displayName,size) VALUES (?,?,?,?,?,?,?,?,?,?)
                                                       at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                       at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
                                                       at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
                                                       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:1467)
                                                       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
                                                       at com.jack.musicandchat.db.AppDB.addSongInfo(AppDB.java:63)
                                                       at com.jack.musicandchat.service.ScanService.onHandleIntent(ScanService.java:90)
                                                       at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
                                                       at android.os.Handler.dispatchMessage(Handler.java:99)
                                                       at android.os.Looper.loop(Looper.java:137)
                                                       at android.os.HandlerThread.run(HandlerThread.java:60)

at com.jack.musicandchat.db.AppDB.addSongInfo(AppDB.java:63)

    public void addSongInfo(SongDetails details) {
        if (details != null) {
            ContentValues values = new ContentValues();
            values.put("_id", details.get_id());
            values.put("id", details.getId());
            values.put("songName", details.getSongName());
            values.put("songSinger", details.getSongSinger());
            values.put("album", details.getAlbum());
            values.put("albumId", details.getAlbumId());
            values.put("displayName", details.getDisplayName());
            values.put("duration", details.getDuration());
            values.put("size", details.getSize());
            values.put("path", details.getPath());
            db.insert(AppDBHelp.TBL_NAME, null, values);
        }
    }

at com.jack.musicandchat.service.ScanService.onHandleIntent(ScanService.java:90)

最后一行是所谓的(ScanService.java:90)

 Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        int _id = 1;
        while (cursor.moveToNext()) {
            int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));
            if (isMusic == 0) continue;
            long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
            if (size < 1024 * 1024) continue;
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
            if (displayName.contains(".mp3")) {
                String[] displayNameArr = displayName.split(".mp3");
                displayName = displayNameArr[0].trim();
            }
            long duration = cursor.getLong(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DURATION));
            String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
            long albumid = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
//            String albumPath = getAlbumPicPath(path, displayName);
            SongDetails info = new SongDetails();
            info.set_id(_id++);
            info.setId(id);
            info.setSongName(title);
            info.setDuration(duration);
            info.setDisplayName(displayName);
            info.setSize(size);
            info.setPath(path);
            info.setSongSinger(artist);
            info.setAlbum(album);
            info.setAlbumId(albumid);

            /**
             *添加数据到数据中
             */
            appDB.addSongInfo(info);
阅读 4.8k
2 个回答

SQL语句左括号前面少了空格

你的sql是create tableXxx(...)
table和表名之间没有空格……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题