1. 程式人生 > >SQLite資料庫和自定義ListView的使用

SQLite資料庫和自定義ListView的使用

使用SQLite的特點:
(1)輕量級
使用 SQLite  只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
(2)獨立性
SQLite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的“安裝”。
(3)隔離性
SQLite 資料庫中所有的資訊(比如表、檢視、觸發器等)都包含在一個資料夾內,方便管理和維護。
(4)跨平臺
SQLite 目前支援大部分作業系統,不至電腦作業系統更在眾多的手機系統也是能夠執行,比如: Android 。
(5)多語言介面
SQLite 資料庫支援多語言程式設計介面。
(6)安全性
SQLite 資料庫通過資料庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味著多個程序可以在同一時間從同一資料庫讀取資料,但只能有一個可以寫入資料。

在這個demo中設計到的知識點有:

1、建立資料庫

2、將資料插入資料庫中

3、將資料從資料庫中刪除

4、更新資料庫中的資料

5、在資料庫中進行查詢

6、獲取表中的所有資料

7、自定義ListView(自定義Adapter)

8、刪除ListView中的item

1、建立資料庫

SQLiteOpenHelper

這個類可以幫助我們對資料庫進行建立和升級,SQLiteOpenHelper是一個抽象類,我們需要去建立一個類來去繼承它,並在自己的類中重寫方法OnCreate()onUpdate(),然後使用者兩個方法去建立、升級資料庫的邏輯。

SQLiteOpenHelper中有兩個非常重要的例項方法:

getReadableDatabase()getWritableDatabase(),這兩個方法都可以建立或者開啟一個現有的資料庫(若不存在則建立一個新的資料庫),並返回一個可對資料庫進行讀寫操作的物件。不同的是,當資料庫不可進行寫入時(磁碟已滿),getReadableDatabase()方法返回的物件以只讀的方式開啟資料庫,而getWritableDatabase()方法則會出現異常。

//例項化幫助類
                MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
                //建立或者開啟一個現有的資料庫
                myDatabaseHelper.getWritableDatabase();
                //關閉開啟資料庫
                myDatabaseHelper.close();

2、將資料插入資料庫中

//執行插入資料語句,將資料插入到資料庫中
    private void InsertBook(Book book){
        MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",book.getName());
        values.put("author",book.getAuthor());
        values.put("pages",book.getPages());
        values.put("price",book.getPrice());
        db.insert("Book",null,values);
    }


3、將資料從資料庫中刪除

//刪除
    private void DeleteDatabase(Book book){
        MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        db.delete("Book","name = ? and author = ?",new String[]{book.getName(),book.getAuthor()});
        myDatabaseHelper.close();
    }


4、更新資料庫中的資料

    private void UpdateDatabase(Book book,Float price){
        MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("price",price);
        db.update("Book",values,"name = ? and author = ?",new String[]{book.getName(),book.getAuthor()});

        myDatabaseHelper.close();
    }


5、在資料庫中進行查詢

    private Book findBook(String name1){
        Book book=null;
        MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        ContentValues values  = new ContentValues();
        Cursor cursor = db.query("Book",null,"name = ?",new String[]{name1},null,null,null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            int pages = cursor.getInt(cursor.getColumnIndex("pages"));
            float price = cursor.getFloat(cursor.getColumnIndex("price"));

            book  = new Book(name,author,pages,price);
        }
        return book;
    }

6、獲取表中的所有資料
    private List<Book> getAllBooks(){
        List<Book> books = new ArrayList<Book>();
        MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
        SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
        //查詢Book表中所有的資料
        Cursor cursor = db.query("Book",null,null,null,null,null,null);
        
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            int pages = cursor.getInt(cursor.getColumnIndex("pages"));
            float price = cursor.getFloat(cursor.getColumnIndex("price"));

            books.add(new Book(name,author,pages,price));
        }
        myDatabaseHelper.close();
        return books;
    }


7、自定義ListView(自定義Adapter)

public class BookAdapter extends ArrayAdapter<Book>{

    private int mResource;
    List<Book> books ;
    public BookAdapter(Context context, int resource, List<Book> objects) {
        super(context, resource, objects);
        mResource = resource;

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        Book book = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null){
            view = LayoutInflater.from(getContext()).inflate(mResource,null);
            viewHolder = new ViewHolder();
            viewHolder.tv_name = (TextView) view.findViewById(R.id.tv_name);
            viewHolder.tv_author = (TextView) view.findViewById(R.id.tv_author);
            viewHolder.tv_pages = (TextView) view.findViewById(R.id.tv_pages);
            viewHolder.tv_price = (TextView) view.findViewById(R.id.tv_price);
           // viewHolder.btn_delete = (Button) view.findViewById(R.id.btn_delete);
            view.setTag(viewHolder);
        }
        else{
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.tv_name.setText(book.getName());
        viewHolder.tv_author.setText(book.getAuthor());
        viewHolder.tv_pages.setText(book.getPages().toString());
        viewHolder.tv_price.setText(book.getPrice()+"");

        return view;
    }



    private void showInfo(int position){
        Book book = getItem(position);

        new AlertDialog.Builder(getContext()).setTitle("詳情")
                .setMessage("書名:"+book.getName()+"    作者:"+book.getAuthor()+"\n頁數:"+book.getPages()+"    價格:"+book.getPrice())
                .setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNegativeButton("取消",null)
                .show();
    }
    class ViewHolder{
        TextView tv_name;
        TextView tv_author;
        TextView tv_pages;
        TextView tv_price;
       // Button btn_delete;
    }
}


8、刪除ListView中的item

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Book book  = (Book) adapterView.getItemAtPosition(i);
            showInfo(i);
    }

    private void showInfo(final int position){

        final Book book  = books.get(position);
        new AlertDialog.Builder(this).setTitle("確認刪除以下資訊")
                .setMessage("書名:"+book.getName()+"    作者:"+book.getAuthor()+"\n頁數:"+book.getPages()+"    價格:"+book.getPrice())
                .setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        books.remove(position);
                        bookAdapter.notifyDataSetChanged();
                        DeleteDatabase(book);
                        //db.delete("Book","name = ? and author = ?",new String[]{book.getName(),book.getAuthor()});
                        Toast.makeText(DeleteActivity.this, "刪除成功", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton("取消",null)
                .show();
    }

demo示例圖