SQLiteOpenHelper

SQLiteOpenHelper是android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。

一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,newVersion)方法。

SQLiteOpenHelper包含如下常用方法:

sychronized SQLiteDatabase getReadableDatabase() 以读写的方式打开数据库对应的SQLiteDataBase对象
sychronized SQLiteDatabase getWriteableDataBase() 以写的方式打开数据库对应的SQLiteDataBase对象
abstract void onCreate(SQLiteDatabase db) 当第一次创建数据库时回调该方法
abstract void onUpgrade(SQLiteDatabase db,int oldVersion,newVersion) 当数据库版本更新时回调该方法
sychronized void close() 关闭所有打开的SQLiteDatabase

实例如下:

布局文件==》main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <EditText
android:id="@+id/edit2"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:id="@+id/btnInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加生词" /> <EditText
android:id="@+id/edit3"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:id="@+id/btnQuery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" /> </LinearLayout>
result.xml==>
<?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" > <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <EditText
android:id="@+id/word"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <EditText
android:id="@+id/detial"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout>
代码实现==》
package com.example.mysqlite2; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class MyDatabaseHelper extends SQLiteOpenHelper
{
final String CREATE_TABLE_SQL = "create table dict(_id integer primary key autoincrement,word,detial)"; public MyDatabaseHelper(Context context, String name, int version)
{
super(context, name, null, version);
Log.i("swg", "-----------MyDatabaseHelper------------");
} @Override
public void onCreate(SQLiteDatabase db)
{
// 第一个使用数据库时自动见表
db.execSQL(CREATE_TABLE_SQL);
Log.i("swg", "-----------创建表成功------------");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
System.out
.println("-----------onUpgrade----------" + oldVersion + "-------->" + newVersion);
} } package com.example.mysqlite2; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map; import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{
MyDatabaseHelper dbHelper;
EditText edit1;
EditText edit2;
EditText edit3;
String dbName = "test.db3"; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建MyDatabaseHelper对象,指定数据库版本为1,此处使用相对路径
// 数据库文件会自动保存在程序的数据文件夹下的databases目录下
dbHelper = new MyDatabaseHelper(this, dbName, 1); edit1 = (EditText) this.findViewById(R.id.edit1);
edit2 = (EditText) this.findViewById(R.id.edit2);
edit3 = (EditText) this.findViewById(R.id.edit3);
Button btnInsert = (Button) this.findViewById(R.id.btnInsert);
Button btnQuery = (Button) this.findViewById(R.id.btnQuery);
btnInsert.setOnClickListener(new MyButtonOnClick());
btnQuery.setOnClickListener(new MyButtonOnClick());
} private class MyButtonOnClick implements OnClickListener
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btnInsert:
String word = edit1.getText().toString();
String detial = edit2.getText().toString(); Log.i("swg", "insert content==" + word + "=========" + detial);
// 插入生词记录
insertData(dbHelper.getReadableDatabase(), word, detial);
Toast.makeText(MainActivity.this, "添加生词成功", Toast.LENGTH_LONG).show();
break;
case R.id.btnQuery:
String key = edit3.getText().toString();
Log.i("swg", "key==" + key);
// 执行查询
String sql = "select * from dict where word like ? or detial like ? ";
Cursor cursor = dbHelper.getReadableDatabase().rawQuery(sql,
new String[] { "%" + key + "%", "%" + key + "%" }); Bundle data = new Bundle();
data.putSerializable("data", convertCursorToList(cursor)); Intent intent = new Intent(MainActivity.this, ResultActivity.class);
intent.putExtras(data);
startActivity(intent);
break;
}
} private ArrayList<Map<String, String>> convertCursorToList(Cursor cursor)
{
ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
while (cursor.moveToNext())
{
Map<String, String> map = new HashMap<String, String>();
map.put("word", cursor.getString(1));
map.put("detial", cursor.getString(2));
result.add(map);
}
return result;
} private void insertData(SQLiteDatabase db, String word, String detial)
{
String sql = "insert into dict values (null,?,?)";
db.execSQL(sql, new String[] { word, detial });
} } @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
protected void onDestroy()
{
super.onDestroy();
// 退出程序时关闭MyDatabaseHelper里的SQLitedatabase
if (dbHelper != null)
dbHelper.close();
} } package com.example.mysqlite2; import java.util.List;
import java.util.Map; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class ResultActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.result); ListView lv = (ListView) this.findViewById(R.id.lv);
Intent intent = getIntent();
Bundle data = intent.getExtras();
@SuppressWarnings("unchecked")
List<Map<String, String>> list = (List<Map<String, String>>) data.getSerializable("data");
// 将list封装成SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.result,
new String[] { "word", "detial" }, new int[] { R.id.word, R.id.detial });
int count = adapter.getCount();
Log.i("swg", "查到" + count + "条");
lv.setAdapter(adapter);
} }

注意:AndroidMainfest.xml需要添加==》<activity android:name="com.example.mysqlite2.ResultActivity" android:theme="@android:style/Theme.Dialog"/>

运行效果:

注意:android实现系统自带样式如下方式:

android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式

android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全屏

android:theme="Theme.Light ": 背景为白色

android:theme="Theme.Light.NoTitleBar" : 白色背景并无标题栏

android:theme="Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏

android:theme="Theme.Black" : 背景黑色

android:theme="Theme.Black.NoTitleBar" : 黑色背景并无标题栏

android:theme="Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏

android:theme="Theme.Wallpaper" : 用系统桌面为应用程序背景

android:theme="Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏

android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标题栏,全屏

android:theme="Theme.Translucent : 透明背景

android:theme="Theme.Translucent.NoTitleBar" : 透明背景并无标题

android:theme="Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏

android:theme="Theme.Panel ": 面板风格显示

android:theme="Theme.Light.Panel" : 平板风格显示

android学习笔记50——SQLiteOpenHelper、android实现系统自带样式的更多相关文章

  1. Android学习笔记50:使用WebView控件浏览网页

    在Android中,可以使用Webview控件来浏览网页.通过使用该控件,我们可以自制一个简单的浏览器,运行效果如图1所示. 图1 运行效果 1.WebView 在使用WebView控件时,首先需要在 ...

  2. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  3. Android学习笔记:对Android应用进行单元测试

     第一步:在AndroidManifest.xml中加入如下两段代码: <manifest xmlns:android="http://schemas.android.com/ap ...

  4. Android学习笔记之:android更新ui的几种经常用法

    Android主线程不能运行耗时操作.我们通常是在子线程中运行耗时操作, 我们在运行完耗时操作后,我们一般能够通过下面几种方式来实现ui界面的更新. 首先是布局文件: <LinearLayout ...

  5. Android学习笔记----解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题

    同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...

  6. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  7. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  8. 【转】Pro Android学习笔记(七):了解Content Provider(下上)

    我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...

  9. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

随机推荐

  1. zju 1002

    // zju 1002 // #include "stdafx.h" #include <string> #include <iostream> using ...

  2. 回顾CSS布局易混淆的概念

    一.浮动模型 元素默认是static的,不能浮动,但可以用CSS样式设置为浮动 浮动模型只有两个值 float:left 和 float:right ,可以让块状元素同行显示 二.层模型 top/bo ...

  3. HTML 段落<p>标签

    <p> 标签定义段落. p 元素会自动在其前后创建一些空白.浏览器会自动添加这些空间,您也可以在样式表中规定. 段间距IE默认为19px,通过p的margin-top属性设置FF默认为1. ...

  4. WinForm窗体更新程序

    流程介绍: 打包参阅:WinForm程序打包说明    图一    图二    图三   实现步骤: 主程序 1.检测是否连上ftp服务器 1.1 连接不上,不检测. 1.2 连接上,如果有更新进程, ...

  5. easyui-menu 宽度自适应

    easyui-menu里的菜单项是从后端获取的,而这个组件提供的API配置只能设置一个固定宽度,当获取的菜单项字数较多时有可能显示不全.解决方法如下: <style> .myClass{f ...

  6. WinForm多线程学习文档

    基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...

  7. C语言基础--变量存储细节

      1.变量为什么要有类型? 每种类型占用的内存空间不一样 int 4, char 1 double 8 2.只要定义变量, 系统就会开辟一块存储空间给我们的变量存储数据, 内存寻址是从大到小 3.越 ...

  8. Spark Streaming之旅

    1. 打开spark-shell 2. 建立StreamingContext import org.apache.spark.streaming._ import org.apache.spark.s ...

  9. ubuntu install wine

    1 install sUdo add-apt-repository ppa:wine/wine-builds sudo apt-get update sudo apt-get install wine ...

  10. C/C++语言 预处理小结

    预处理功能主要包括宏定义,文件包含,条件编译三部分.分别对应宏定义命令,文件包含命令,条件编译命令三部分实现. 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换.预处理 ...