Sqlite的使用和一个简单的书籍管理系统(下)

运行效果如下 我们一步一步来实现有点手抽、、
之前我们是完成了布局和sqlite建库和基本的工具类现在我们来开始写业务逻辑
来写一个MainActivity

public class MainActivity extends Activity {
    private ListView mBookListView;
    private EditText edtname;
    private EditText edtprice;
    private SimpleCursorAdapter simpleCursorAdapter;
    private Cursor cursor;
    private Context context;//因为要经常使用上下文 所以新建一个context

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.book_item);
        context = this;
        edtname = (EditText) findViewById(R.id.name_et);
        edtprice = (EditText) findViewById(R.id.price_et);
        mBookListView = (ListView) findViewById(android.R.id.list);

        // ListView要展示批量结构化的数据1.列表项 2.初始数据 3.适配器4.监听
        // 2初始数据
        cursor = new DButils(this).findcursor();
        // 3.游标适配器 将数据库里面的文字和数据传给控件显示出来
        simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.activity_main, cursor,
                new String[] { DButils.ID, DButils.NAME, DButils.PRICE, DButils.ID },
                new int[] { R.id.id_tv, R.id.name_tv, R.id.price_tv, R.id.delete_tv });
        // FLAG_REGISTER_CONTENT_OBSERVER :注册内容观察
        mBookListView.setAdapter(simpleCursorAdapter);
        // 4长按监听
        mBookListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                DButils dbUtils = new DButils(context);
                cursor.moveToPosition(position);
                int id1 = cursor.getInt(cursor.getColumnIndex("_id"));
                Toast.makeText(getApplicationContext(), "通过位置取得的" + id + "通过游标取得" + id1, Toast.LENGTH_SHORT).show();
                dbUtils.delete((int) id);
                //刷新操作!!!!增删都要用到
                cursor.requery();
                // 假如查询数据库,建议开启子线程
                simpleCursorAdapter.notifyDataSetChanged();
                // 发一个通知刷新,关联的listview刷新
                return false;
            }
        });

    }

    // 添加记录
    public void add(View v) {
        DButils dButils = new DButils(context);
        String name=edtname.getText().toString().trim();
        String price=edtprice.getText().toString().trim();
        ContentValues values=new ContentValues();
        values.put(dButils.NAME, name);
        values.put(dButils.PRICE, price);
        dButils.save(values);
        cursor.requery();
        // 假如查询数据库,建议开启子线程
        simpleCursorAdapter.notifyDataSetChanged();
        // 发一个通知刷新,关联的listview刷新
        edtname.setText("");
        edtprice.setText("");
    }

    // 删除记录
    public void delete(View v) {
        TextView textView = (TextView) v;
        String string = textView.getText().toString();
        DButils dButils = new DButils(context);
        dButils.delete(Integer.valueOf(string));
        cursor.requery();
        // 假如查询数据库,建议开启子线程
        simpleCursorAdapter.notifyDataSetChanged();
        // 发一个通知刷新,关联的listview刷新
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        System.out.println("ondestory");
        if (cursor != null) {
            cursor.close();

        }
        super.onDestroy();
    }

}

逻辑很清楚,注释我也写的很明白了。就有个点要注意一下
SimpleCursorAdapter适配器是继承了CursorAdapter
继承关系如下

CursorAdapter 继承了 BaseAdapter
好处:仅加载需要显示的数据,性能好

使用方法:
1.实现两个参数构造方法
2.重写newView()方法
layout->view
3.重写bindView()方法
view.set

数据更新:
adapter.changeCursor(cursor);
adapter.notifyDataSetChanged();
我们上面的例子是使用

    cursor.requery();
        // 假如查询数据库,建议开启子线程
        simpleCursorAdapter.notifyDataSetChanged();
        // 发一个通知刷新,关联的listview刷新

来更新simpleCursorAdapter,并且传递给listview
代码如下:

public void createCursorAdapter(Cursor cursor)
    { //游标适配器,构造方法,传入cursor
        mAdapter = new CursorAdapter(this, cursor)
        {//重写两个方法
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent)
            {//找到布局和控件
                ViewHolder holder = new ViewHolder();
                LayoutInflater inflater = getLayoutInflater();
                View inflate = inflater.inflate(R.layout.listview_item, null);
                holder.item_tv_name = (TextView) inflate.findViewById(R.id.item_tv_name);
                holder.item_tv_phone = (TextView) inflate.findViewById(R.id.item_tv_phone);
                inflate.setTag(holder);
                return inflate;//返回的view传给bindView。
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor)
            {//复用布局。
//                把数据设置到界面上
                ViewHolder holder = (ViewHolder) view.getTag();
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String phone = cursor.getString(cursor.getColumnIndex("phone"));
                holder.item_tv_name.setText(name);
                holder.item_tv_phone.setText(phone);
            }

        };

    };

再有就是那个删除标志的用法哪里要注意,把字体设置为透明。Textview的点击事件clickable设置为true。点击传text里面的id。
那个id有时候自己重写geTItemId()方法时会覆盖。这里暂且就不研究了,遇到了再说。。。看到这里,自己编一遍跑一下吧!

转载于:https://www.cnblogs.com/Tesi1a/p/7624150.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例,演示如何使用 FastAPI 和 SQLite 创建一个档案库管理系统。 首先,安装必要的库: ``` pip install fastapi pip install uvicorn pip install databases pip install sqlalchemy ``` 然后,创建一个 `main.py` 文件,并输入以下代码: ```python from fastapi import FastAPI from pydantic import BaseModel from typing import List import databases from databases import Database import sqlalchemy from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String app = FastAPI() # 数据库配置信息 DATABASE_URL = "sqlite:///./test.db" # 创建数据库连接 database = Database(DATABASE_URL) # SQLAlchemy 元数据 metadata = MetaData() # 模型对应的数据库表 books = Table( "books", metadata, Column("id", Integer, primary_key=True), Column("title", String(50)), Column("author", String(50)), Column("description", String(200)), Column("price", Integer), ) # 创建数据库表 engine = create_engine(DATABASE_URL) metadata.create_all(engine) # 数据模型 class Book(BaseModel): title: str author: str description: str price: int # 创建新书籍 @app.post("/books/") async def create_book(book: Book): query = books.insert().values( title=book.title, author=book.author, description=book.description, price=book.price, ) last_record_id = await database.execute(query) return {**book.dict(), "id": last_record_id} # 获取所有书籍 @app.get("/books/") async def read_books(): query = books.select() results = await database.fetch_all(query) return results # 获取单个书籍 @app.get("/books/{book_id}") async def read_book(book_id: int): query = books.select().where(books.c.id == book_id) result = await database.fetch_one(query) if result: return result else: return {"error": "Book not found"} # 更新书籍 @app.put("/books/{book_id}") async def update_book(book_id: int, book: Book): query = ( books.update() .where(books.c.id == book_id) .values( title=book.title, author=book.author, description=book.description, price=book.price, ) ) await database.execute(query) return {**book.dict(), "id": book_id} # 删除书籍 @app.delete("/books/{book_id}") async def delete_book(book_id: int): query = books.delete().where(books.c.id == book_id) await database.execute(query) return {"message": "Book deleted successfully"} # 连接到数据库 @app.on_event("startup") async def startup(): await database.connect() # 断开数据库连接 @app.on_event("shutdown") async def shutdown(): await database.disconnect() ``` 这个示例创建了一个名为 `books` 的数据库表,用于存储书籍信息。它提供了以下 API: - `POST /books/`:创建新书籍 - `GET /books/`:获取所有书籍 - `GET /books/{book_id}`:获取单个书籍 - `PUT /books/{book_id}`:更新书籍 - `DELETE /books/{book_id}`:删除书籍 你可以使用 SQLite 数据库浏览器等工具来管理数据。 最后,在命令行中运行以下命令启动应用程序: ``` uvicorn main:app --reload ``` 现在,你可以通过浏览器或其他 HTTP 客户端来访问这些 API。例如,要创建一个书籍: ``` POST http://localhost:8000/books/ { "title": "Python入门教程", "author": "张三", "description": "一本Python入门教程", "price": 50 } ``` 要获取所有书籍: ``` GET http://localhost:8000/books/ ``` 要获取单个书籍: ``` GET http://localhost:8000/books/1 ``` 要更新书籍: ``` PUT http://localhost:8000/books/1 { "title": "Python入门教程2", "author": "张三", "description": "一本Python入门教程", "price": 60 } ``` 要删除书籍: ``` DELETE http://localhost:8000/books/1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值