Android ORMLite no such table exception

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

        本来是在别人写的项目基础上升级修改的,读取源代码发现项目中运用到原生的SQLite API,也用到xutils的数据库api和 KJFrameForAndroid的数据库模块,感觉不好维护,就从网上了解能够快速入手,效率还不错的单一功能的数据库框架。

        感觉greenDao和ORMLite都还不错,但是greenDao无从下手,项目又有一点急,所以就选择ORMLite 数据库api ,下面以项目中的消息模块为例。

        用android studio开发,真的省了不少力,很快引入库和新建自己的数据库帮助类:


    compile files('libs/ormlite-android-4.48.jar')
    compile files('libs/ormlite-core-4.48.jar')
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {
    private static final String DATABASE_NAME = "market.db";
    private static final int DATABASE_VERSION = 1;

    private Dao messageDao = null;

    public DataBaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        LogUtils.d("DatabaseHelper onCreate");
        try {
//            TableUtils.clearTable(connectionSource, MyMessage.class);
            TableUtils.createTableIfNotExists(connectionSource, MyMessage.class);
        } catch (SQLException e) {
            e.printStackTrace();
            LogUtils.e("can't create database", e);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        LogUtils.d("DatabaseHelper onCreate");
        try {
            TableUtils.dropTable(connectionSource, MyMessage.class, true);
            onCreate(sqLiteDatabase, connectionSource);
        } catch (SQLException e) {
            LogUtils.e("Can't drop databases", e);
            throw new RuntimeException(e);
        }
    }

    private static DataBaseHelper instance;

    /**
     * 单例获取该Helper
     *
     * @param context
     * @return
     */
    public static synchronized DataBaseHelper getHelper(Context context) {
        context = context.getApplicationContext();
        if (instance == null) {
            synchronized (DataBaseHelper.class) {
                if (instance == null)
                    instance = new DataBaseHelper(context);
            }
        }

        return instance;
    }

    public synchronized Dao getDao() throws SQLException {
        if (messageDao == null)
            messageDao = getDao(MyMessage.class);

        return messageDao;
    }

    /**
     * 释放资源
     */
    @Override
    public void close() {
        super.close();

        if (messageDao != null)
            messageDao = null;
    }
}

        又新建了MesageDao管理类:

public class MessageDao {

    private Context context;
    private Dao messageDao;
    private DataBaseHelper helper;
    private static final long PAGE_SIZE = 10L;

    public MessageDao(Context context) {
        this.context = context;
        try {
            helper = DataBaseHelper.getHelper(context);
            messageDao = helper.getDao(MyMessage.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void insert(MyMessage msg) {
        LogUtils.d("dao = " + messageDao + ",MyMessage = " + msg.toString());
        try {
            int value = messageDao.create(msg);
            LogUtils.d("插入数据返回值:" + value);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public List findByPage(int page) throws SQLException {
        QueryBuilder builder = messageDao.queryBuilder();
        builder.orderBy("id", true);
        builder.offset((page - 1) * PAGE_SIZE);
        builder.limit(PAGE_SIZE);
        return builder.query();
    }

    public List findAll() {
        List messages = null;
        try {
            messages = messageDao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return messages;
    }

    public void deleteById(int id) {
        try {
            int value = messageDao.deleteById(id);
            LogUtils.d("删除一条数据返回值:" + value);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void deleteByData(MyMessage msg) {
        int value = 0;
        try {
            value = messageDao.delete(msg);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        LogUtils.d("删除一条数据返回值:" + value);
    }

    public void deleteAll() {
        try {
            List messages = messageDao.queryForAll();
            int value = 0;
            if (messages != null && !messages.isEmpty()) {
                value = messageDao.delete(messages);
            }
            LogUtils.d("删除所有数据返回值:" + value);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

        数据库帮助类中onCreate中起初用的是注释的代码。以为就这样就完成,然后在Activity中引用,是适当的时候插入就可以了。但是并没有朝着自己的想法前进,收到消息,但是数据库中却没有一条数据,总是得到

no such table: tb_message

        在StackOverFlow中找到http://stackoverflow.com/questions/30916126/android-ormlite-no-such-table-exception,然后修改onCreate创建表的方法,但是还是不行,一直包上面的错误。一步一步的执行,发现帮助类总是不执行onCreate方法, 感觉是因为已经存在数据库,所以不执行创建。于是,放测试机上面的项目删除,重新安装,然后就发现消息可以存储了,一切正常了,一切看起来是那么的美好!

转载于:https://my.oschina.net/deepSprings/blog/710402

你可能感兴趣的:(Android ORMLite no such table exception)