SQLiteDatabase的使用

</pre>直接上代码</p><p><pre name="code" class="java">package com.cnfol.sqlitedb;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class DBTest extends Activity {

    SQLiteDatabase db;
    Button bn = null;
    ListView listView;
    EditText et_title, et_content;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dbtest);
        //创建或打开数据库(此处需要使用绝对路径)
        //①
        db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString() + "/my.db3", null);
        listView = (ListView) findViewById(R.id.listview);
        bn = (Button) findViewById(R.id.btn);
        et_title = (EditText) findViewById(R.id.et_title);
        et_content = (EditText) findViewById(R.id.et_content);
        bn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取用户输入
                String title = et_title.getText().toString();
                String content = et_content.getText().toString();

                try {
                    insertData(db, title, content);
                    Cursor cursor = db.rawQuery("select * from news_inf", null);
                    inflateList(cursor); 
                } catch (SQLiteException e) {
                    //执行DDL创建数据表
                    db.execSQL("create table news_inf(_id integer"
                            +" primary key autoincrement,"
                            +" news_title varchar(50),"
                            +" news_content varchar(255))");
                    //执行insert语句插入数据
                    insertData(db,title,content);
                    //执行查询
                    Cursor cursor = db.rawQuery("select * from news_inf", null);
                    inflateList(cursor);
                }

            }
        });
    }

    /**
     * 填充SimpleCursorAdapter
     * @param cursor
     */
    private void inflateList(Cursor cursor) {
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                DBTest.this,
                R.layout.line,
                cursor,
                new String[]{"news_title","news_content"},
                new int[]{R.id.tv_title,R.id.tv_content},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);//③
        //显示数据
        listView.setAdapter(adapter);
    }

    /**
     * 执行插入语句
     * @param db
     * @param title
     * @param content
     * ②
     */
    private void insertData(SQLiteDatabase db,
                            String title,
                            String content) {
        db.execSQL("insert into news_inf values(null,?,?)",
                new String[]{title,content});
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出程序时关闭SQLiteDatabase
        if (db!=null&&db.isOpen()){
            db.close();
        }
    }


    /**
     *    上面的程序中①号粗体字代码用于创建或打开SQLite数据库。
     * 当用户单击程序中的“插入”按钮时,程序会调用②号粗体字
     * 代码向底层数据表中插入一行记录,并执行查询语句,把底层
     * 数据表中的记录查询出来,并使用ListView将结果(Cursor)
     * 显示出来。p417完
     *
     *    程序中的③号代码用于将Cursor封装成SimpleCursorAdapter,
     * 这个SimpleCursorAdapter实现了Adapter接口,因此可以作为
     * ListView或GridView的内容适配器。
     *
     *    SimpleCursorAdapter的构造器参数与SimpleAdapter的构造
     * 参数大致相同,区别是SimpleAdapter负责封装集合元素为Map的List,
     * 而SimpleCursorAdapter负责封装Cursor--如果我们把Cursor里的
     * 结果集合当成List集合,Cursor里的每一行当成Map处理(以数据列的
     * 列名为Key,数据列的值为value),那么SimpleCursorAdapter与
     * SimpleAdapter就统一起来了。
     *
     *    需要指出的是,使用SimpleCursorAdapter封装Cursor时要求底
     * 层数据表的主键列的列名为_id,因为SimplerCursorAdapter只能识别
     * 列名为_id的主键。因此上面的程序创建数据表时指定了主键列的列名为
     * _id,否则就会出现 java.lang.IIIegalArgumentException:
     * column '_id' does not exist错误。
     *
     *    上面的程序中我们重写了Activity的onDestory()方法,当应用
     * 程序退出该Activity时将会回调该方法,程序在该方法中关闭了
     * SQLiteDatabase---就像JDBC编程中需要关闭Statement和Connection
     * 一样,这里也需要关闭SQLiteDatabase,否则可能引发资源泄漏。
     *
     * 总结起来使用SQLiteDatabase进行数据库操作的步骤如下:
     * ①:获取SQLiteDatabase对象,它代表了与数据库的连接。
     * ②:调用SQLiteDatabase的方法来执行SQL语句。
     * ③:操作SQL语句的执行结果,比如用SimpleCursorAdapter封装Cursor.
     * ④:关闭SQLiteDatabase,回收资源。
     *
     *
     *
     */
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值