Android的SQlite的使用

Android系统集成了一个轻量级的数据库:SQlite。SQlite不像Oracle、MySQl数据库那样需要安装、启动服务器进程,SQLite数据库只是一个文件

实例1:向数据库里插入数据

主界面:

由两个输入框和一个按钮,以及一个ListView组成
在输入框输入数据,点击按钮发送,数据会送到SQLite中并且在ListView中显示出来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <EditText
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="2"
        />
    <Button
        android:id="@+id/ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送"
        />
    <ListView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>

ListView用的样式Line.xml界面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/my_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:width="120dp"
        />
    <EditText
        android:id="@+id/my_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

Java代码:

public class MainActivity extends Activity{
    SQLiteDatabase db;
    Button bn = null;
    ListView listView;
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建或打开数据库
        db = SQLiteDatabase.openOrCreateDatabase(
                this.getFilesDir().toString() + "/my.db3", null);
        listView = (ListView)findViewById(R.id.show);
        bn = (Button) findViewById(R.id.ok);
        bn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = ((EditText)findViewById(R.id.title)).getText().toString();
                String content = ((EditText)findViewById(R.id.content)).getText().toString();
                try {
                    insertData(db, title, content);
                    Cursor cursor = db.rawQuery("select * from news_inf", null);
                    inflateList(cursor);
                }catch (SQLiteException se){
                    db.execSQL("create table news_inf(_id integer"
                    + " primary key autoincrement,"
                    + " news_title varchar(50),"
                    + " news_content varchar(255))");
                    insertData(db, title,content);
                    Cursor cursor = db.rawQuery("select * from news_inf"
                    , null);
                    inflateList(cursor);
                }
            }
        });
    }
    private void insertData(SQLiteDatabase db, String title, String content){
        //执行插入语句
        db.execSQL("insert into news_inf values(null , ? , ?)",
                new String[] {title, content });
    }
    private void inflateList(Cursor cursor){
        //填充SimpleCursorAdapter
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                MainActivity.this,
                R.layout.line, cursor,
                new String[] { "news_title", "news_content" }
                , new int[] {R.id.my_title, R.id.my_content},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        listView.setAdapter(adapter);
    }
    public void onDestroy(){
        super.onDestroy();
        //退出程序时关闭SQLiteDatabase
        if (db != null && db.isOpen()){
            db.close();
        }
    }
}

上一个例子中在判断底层数据库是否包含newsinf数据表时使用了try,catch
也就是先尝试插入记录如果根据抛出异常,就创建news_inf数据表,再插入记录.
这样的方式其实有些繁琐,使用Android提供的SQliteOpenHelper能够处理这个问题

 

实例2:英语单词本

先创建SQLiteOpenHelper的子类,代码如下:

public class MyDatabaseHelper extends SQLiteOpenHelper{
    final String CREATE_TABLE_SQL =
            "create table dict(_id integer primary " +
                    "key autoincrement , word , detail)";
    public MyDatabaseHelper(Context context, String name, int version){
        super(context, name, null, version);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        //第一次使用数据库时自动建表
        db.execSQL(CREATE_TABLE_SQL);
    }

    @Override
    //用于更新数据库时,打印一条提示的消息
    // oldversion与newVersion为数据库的旧版本与新版本
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("--------onUpdate Called--------"
         + oldVersion + "--->" + newVersion);
    }
}

可以看到这个类继承了SQLiteOpenHelper并且重写了onCreate方法,当程序第一次启动时
系统就会调用onCreate方法来初始化底层数据

如果这个类的实例传入的数据的数据库版本号高于已有的版本号,
则系统会自动调用onUpgrade方法来更新数据库。


然后来看实例的程序,主界面如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/word"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/detail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/insert"/>
    <EditText
        android:id="@+id/key"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/search"/>
</LinearLayout>

主界面前两个输入框用来输入英文与相应的翻译,输入后点击insert按钮就将单词录入数据库

第三个输入框输入想要查询的英文,然后点击search按钮进行查询

MainActivity代码如下:

public class MainActivity extends AppCompatActivity {
    MyDatabaseHelper dbHelper;
    Button insert = null;
    Button search = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建MyDatabaseHelper对象,指定数据库版本为1
        dbHelper = new MyDatabaseHelper(this, "myDict.db3", 1);
        insert = (Button) findViewById(R.id.insert);
        search = (Button) findViewById(R.id.search);
        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String word = ((EditText)findViewById(R.id.word)).getText().toString();
                String detail = ((EditText)findViewById(R.id.detail)).getText().toString();
                //插入生词记录
                insertData(dbHelper.getReadableDatabase(), word, detail);
                Toast.makeText(MainActivity.this, "添加生词成功", Toast.LENGTH_SHORT).show();
            }
        });
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取用户输入
                String key = ((EditText)findViewById(R.id.key)).getText().toString();
                //执行查询
                Cursor cursor = dbHelper.getReadableDatabase().rawQuery(
                        "select * from dict where word like ? or detail like ?",
                        new String[] {"%" + key + "%", "%" + key + "%"});
                //创建一个Bundle对象
                Bundle data = new Bundle();
                data.putSerializable("data", converCursorTolist(cursor));
                //创建一个Intent
                Intent intent = new Intent(MainActivity.this, ResultActivity.class);
                intent.putExtras(data);
                startActivity(intent);
            }
        });
    }
    protected ArrayList<Map<String, String>>
    converCursorTolist(Cursor cursor){
        ArrayList<Map<String, String>> result = new ArrayList<Map<String,String>>();
        //遍历Cursor结果集
        while (cursor.moveToNext())
        {
            Map<String, String> map = new HashMap<>();
            map.put("word", cursor.getString(1));
            map.put("detail", cursor.getString(2));
            result .add(map);
        }
        return result;
    }
    private void insertData(SQLiteDatabase db, String word, String detail) {
        //执行插入语句
        db.execSQL("insert into dict values(null , ? , ?)"
        , new String[]{word, detail });
    }

    public void onDestroy(){
        //退出程序时关闭数据库
        super.onDestroy();
        if (dbHelper != null){
            dbHelper.close();
        }
    }
}

这个程序点击查询按钮时会跳转到ResultActivity,代码如下:

public class ResultActivity extends Activity {
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup);
        ListView listView = (ListView) findViewById(R.id.show);
        Intent intent = getIntent();
        //获取intent所携带的数据
        Bundle data = intent.getExtras();
        List<Map<String, String>> list = (List<Map<String, String>>)data.getSerializable("data");
        //将List封装成SimpleAdapter
        SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this
        , list,
                R.layout.line, new String[]{ "word", "detail" }
        , new int[] {R.id.word, R.id.detail});
        //填充ListView
        listView.setAdapter(adapter);
    }
}

 

posted on 2019-03-26 17:36  vonzc  阅读(139)  评论(0编辑  收藏  举报