Android开发进阶系列(七) 使用数据库

本文详细介绍了一个具体的Android应用程序中如何创建和使用SQLite数据库进行商品库存管理,包括数据库版本控制、表结构设计、数据增删改查等核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库的概念不用多说了吧,增删改查这些基本语句大概的样子也应该略有所闻了。Android的数据库略有不同,不过也没有那么神秘,对于新手来说,一个字,开练!

在我的项目里,我是新建了一个类负责数据库的操作的,下面上代码:

  1. 版本号
// 数据库名称
private static String DBName="easyretail.db";
LocalDatabase(Context paramContext) {
        super(paramContext, DBName, null, 2); // 2为version
}
  1. 建表
@Override
    public void onCreate(SQLiteDatabase db) {
        try {
          db.execSQL("CREATE TABLE IF NOT EXISTS stock (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, " +
                "cost DECIMAL(4,1), price DECIMAL(4,1) NOT NULL, amount INTEGER NOT NULL, total_sold INTEGER NOT NULL, stock_date Text NOT NULL, pic BLOB NULL);");

        db.execSQL("CREATE TABLE IF NOT EXISTS record (id INTEGER PRIMARY KEY AUTOINCREMENT, payment DECIMAL(6,1) NOT NULL, profit DECIMAL(6,1) NOT NULL, " +
                "add_time Text NOT NULL, year INTEGER NOT NULL, month INTEGER NOT NULL, day INTEGER NOT NULL);");

        db.execSQL("CREATE TABLE IF NOT EXISTS recorddetail (id INTEGER PRIMARY KEY AUTOINCREMENT, record_id INTEGER, goods_id INTEGER," +
                "goods_name TEXT NOT NULL, goods_price DECIMAL(4,1) NOT NULL, goods_amount INTEGER NOT NULL, goods_payment DECIMAL(4,1) NOT NULL, goods_pic BLOB NULL);");

        } catch(Exception e) {
            e.printStackTrace();
        }       
    }
  1. 更新表
@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(" ALTER TABLE record ADD profit DECIMAL(6,1) NULL");
        /* version=2时的更新
        //db.execSQL("CREATE TABLE IF NOT EXISTS record (id INTEGER PRIMARY KEY AUTOINCREMENT, payment DECIMAL(6,1) NOT NULL, " +
            //  "add_time Text NOT NULL, year INTEGER NOT NULL, month INTEGER NOT NULL, day INTEGER NOT NULL);");

        //db.execSQL("CREATE TABLE IF NOT EXISTS recorddetail (id INTEGER PRIMARY KEY AUTOINCREMENT, record_id INTEGER, goods_id INTEGER," +
            //  "goods_name TEXT NOT NULL, goods_price DECIMAL(4,1) NOT NULL, goods_amount INTEGER NOT NULL, goods_payment DECIMAL(4,1) NOT NULL);");
         */ 
        // version = 3时
        //db.execSQL(" ALTER TABLE stock ADD pic BLOB NULL "); //往表中增加一列图片类型
        // version =4 时
        //db.execSQL(" ALTER TABLE recorddetail ADD goods_pic BLOB NULL "); //往表中增加一列图片类型
    }

注意,如果你以前发布的版本中数据库版本也不同,那你可能需要判断当前数据库的版本来决定执行哪些更新语句。

  1. 数据的增删改查
    /*
     * 查询数据库,给goodsList赋值
     */
    public void InitGoodsList() {
        Log.v(FusionField.TAG, "InitGoodsList() called");

        try {
            SQLiteDatabase localSQLiteDatabase = getReadableDatabase();
            //Cursor localCursor = localSQLiteDatabase.query(GoodsTableName, null,null,null, null, null, null);
            Cursor localCursor = localSQLiteDatabase.rawQuery("select * from stock",null);

            if (localCursor != null) {
                if(FusionField.goodsList==null)
                    FusionField.goodsList = new ArrayList<GoodsInfo>();  

                GoodsInfo goods;

                while(localCursor.moveToNext()){  
                    int id = localCursor.getInt(localCursor.getColumnIndex(GoodsTable_Column_ID));  
                    goods = FusionField.FindGoodsByID(id);
                    if(goods==null){        
                        goods = new GoodsInfo();  
                        goods.setID(id);  
                        FusionField.goodsList.add(goods);
                    }
                    String name = localCursor.getString(localCursor.getColumnIndex(GoodsTable_Column_Name)); 
                    float cost = localCursor.getFloat(localCursor.getColumnIndex(GoodsTable_Column_Cost)); 
                    float price = localCursor.getFloat(localCursor.getColumnIndex(GoodsTable_Column_Price)); 
                    int amount = localCursor.getInt(localCursor.getColumnIndex(GoodsTable_Column_Amount)); 
                    String stock_date = localCursor.getString(localCursor.getColumnIndex(GoodsTable_Column_StockDate)); 
                    int total_sold = localCursor.getInt(localCursor.getColumnIndex(GoodsTable_Column_TotalSold));
                    byte[] pic = localCursor.getBlob(localCursor.getColumnIndex(GoodsTable_Column_Pic));
                    goods.setName(name);  
                    goods.setCost(cost);
                    goods.setPrice(price);
                    goods.setAmount(amount);       
                    goods.setStockDate(FusionField.ConverStringToDate(stock_date));
                    goods.setTotalSold(total_sold);
                    if(pic!=null)
                        goods.setPicture(FusionField.ConvertByteToBitmap(pic));
                }
                localCursor.close();
            }

            localSQLiteDatabase.close();
        } catch (SQLiteException localSQLiteException) {
            Log.v(FusionField.TAG, "SQLite exception in LocalDatabase.InitGoodsList(): " + localSQLiteException.getMessage());
        }
    }

    /*
     * 修改数据
     * return 0: succeeded
     *       -1: failed
     */
    public Boolean ModifyGoods(int id, String name, int amount, float cost, float price, byte[] pic) {
        Log.v(FusionField.TAG, "ModifyGoods(" + id + ", " + name + ", " + amount + ", " + cost + ", " + price + ") called");
        Boolean ret = true;
        try {
            SQLiteDatabase localSQLiteDatabase = getWritableDatabase();
            Cursor localCursor = localSQLiteDatabase.query(GoodsTableName, new String[]{"amount"}, "id = ?", new String[]{String.valueOf(id)}, null, null, null);

            if (localCursor != null && localCursor.moveToFirst()) {
                ContentValues localContentValues = new ContentValues();
                localContentValues.put("name", name); // 名称
                localContentValues.put("amount", amount); // 数量
                localContentValues.put("cost", cost); // 成本
                localContentValues.put("price", price); // 价格
                localContentValues.put("pic", pic); // 图片
                localSQLiteDatabase.update(GoodsTableName, localContentValues, "id = ?", new String[]{String.valueOf(id)});
            } else
                ret = false; // Error, not exists

            localCursor.close();
            localSQLiteDatabase.close();
        } catch (SQLiteException localSQLiteException) {
            Log.v(FusionField.TAG, "SQLite exception in LocalDatabase.UpdateStock(): " + localSQLiteException.getMessage());
            ret = false;
        }

        return ret;
    }

    /*
     *  删除某商品
     */
    public Boolean DeleteGoodsFromStock(int id) {
        Log.v(FusionField.TAG, "DeleteGoodsFromStock(" + id + ") called");
        Boolean ret = true;

        try {
            SQLiteDatabase localSQLiteDatabase = getWritableDatabase();         
            localSQLiteDatabase.delete(GoodsTableName, "id = ?", new String[]{String.valueOf(id)});

            localSQLiteDatabase.close();

        } catch (SQLiteException localSQLiteException) {
            Log.v(FusionField.TAG, "SQLite exception in LocalDatabase.DeleteGoodsFromStock(): " + localSQLiteException.getMessage());
            ret = false;
        }

        return ret;
    }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值