File file = new File(“hah.txt”);
//只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在。如果文件不存在,则不会被创建。
必须要有文件输出流对文件进行了写的操作,文件才会被创建。
游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的。游标相当于数组的指针,通过游标的上下移动来查找数据。
创建数据库
package com.test.sqllitedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子类构造函数的参数不一定要和父类构造函数的参数一一对应
public MyDBOpenHelper(Context context) {
/**
* @paramcontext 上下文
* @paramname 数据库文件的名称
* @paramfactory 用来创建游标对象,null就用默认的游标工厂
* @paramversion 数据库的版本 号,从1开始。用来更新数据库。
* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别
*/
super(context, "test.db", null,1);
}
@Override
//数据库第一次创建的时候自动执行
public void onCreate(SQLiteDatabase db) {
}
@Override
//数据库版本更新时自动执行
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
创建数据库
package com.test.sqllitedemo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//执行该行代码,数据库不会被创建,只是创建了一个数据库对象
MyDBOpenHelper helper = new MyDBOpenHelper(this);
//创建或者打开一个数据库,该数据库具有读写权限,位于data/data/应用程序包名/databases /文件夹下面
helper.getWritableDatabase();
}
}
在SQLite中创建表
SQLite中所有数据类型默认存储都是字符串类型的,没有长度限制的。超过表定义时的数据长度,也不会报错。
在Android中SQLite会自动创建一张名为android_metadata的表。用于存储当前的语言环境的。在SQLite中id推荐使用_id。
SQLite的数据库版本只能增大,不能减小。
package com.test.sqllitedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子类构造函数的参数不一定要和父类构造函数的参数一一对应
public MyDBOpenHelper(Context context) {
/**
* @paramcontext 上下文
* @paramname 数据库文件的名称
* @paramfactory 用来创建游标对象,null就用默认的游标工厂
* @paramversion 数据库的版本 号,从1开始。用来更新数据库。
* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别
*/
super(context, "test.db", null,1);
}
@Override
//数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法
/**
* 该方法中创建表结构,初始化数据库
* @param db 代表的是创建好的数据库
*/
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//执行SQL语句
db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
}
@Override
//数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小
//int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据
//如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("alter table info add money varchar(10)");
}
}
EL表达式只能在jsp页面中使用。
数据库的增删改查。
<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="com.test.databaseoper.MainActivity" >
<Button
android:onClick="add"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="add" />
<Button
android:onClick="update"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="update" />
<Button
android:onClick="delete"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="delete" />
<Button
android:onClick="query"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="query" />
</LinearLayout>
package com.test.databaseoper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子类构造函数的参数不一定要和父类构造函数的参数一一对应
public MyDBOpenHelper(Context context) {
/**
* @param context 上下文
* @param name 数据库文件的名称
* @param factory 用来创建游标对象,null就用默认的游标工厂
* @param version 数据库的版本 号,从1开始。用来更新数据库。
* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别
*/
super(context, "test.db", null,1);
}
@Override
//数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法
/**
* 该方法中创建表结构,初始化数据库
* @param db 代表的是创建好的数据库
*/
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//执行SQL语句
db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varch ar(20))");
}
@Override
//数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小
//int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据
//如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("alter table info add money varchar(10)");
}
}
package com.test.databaseoper;
import java.util.Random;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view){
//创建数据库
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Random random = new Random();
String sql = "insert into info(name,phone)values(?,?)";
//在SQLite中,也可以使用占位符来传递参数
db.execSQL(sql, new Object[]{"lisi"+random.nextInt(100),"453231"});
//释放资源
db.close();
}
public void delete(View view){
}
public void update(View view){
}
public void query(View view){
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "select * from info";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println(id+" "+name+" "+phone);
}
//释放资源
cursor.close();
db.close();
}
}
在SQLite中,所有的数据都是当做字符串存的。
Android数据库中支持中文显示
查看SQLite中表中的数据的三种方式
1.写sql语句把数据查出,显示在logcat中查看
2.在应用程序独立数据区,把数据库pull出来,然后再可是话工具中查看
3.在命令行查看SQLite数据库中表中的数据
更改命令行默认的编码集
chcp(change current page) 65001(utf-8的编码值)
插入重复数据时,应该提示用户是否覆盖已有的数据。
删除数据时,应该提示用户是否确定删除。
程序的设计应该有良好的提示和操作方式。
查询操作不会更改数据库中的内容。一般获取可读的数据库。
多线程写数据库,必须明确写入的先后顺序。以及加锁。
读的操作可以多线程并发操作,写数据库的操作必须枷锁。
googleAndroidapi对数据库的增删改查
package com.test.databaseoper;
import java.util.Random;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class GoogleDataBaseOPR extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view) {
// 创建数据库
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Random random = new Random();
ContentValues values = new ContentValues();
values.put("name", "lisi" + random.nextInt(100));
values.put("phone", "12345678");
/*
* db.insert(table, nullColumnHack, values)
* 第一个参数:表名
* 第二个参数:要填充空值的列
* 第三个参数:插入的值 map集合,ContentValues
*/
long id = db.insert("info", null, values);
if (id != -1) {
Toast.makeText(this, "添加成功,添加在" + id + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();
}
// 释放资源
db.close();
}
public void delete(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.delete(table, whereClause, whereArgs)
* 第一个参数:表名
* 第二个参数:选择条件
* 第三个参数:选择条件的参数
* 返回值:删除的行数,如果没有删除,返回0;
*/
int result = db.delete("info", null, null);
db.close();
if (result != 0) {
Toast.makeText(this, "删除"+ result + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "删除失败" , Toast.LENGTH_SHORT).show();
}
}
public void update(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.update(table, values, whereClause, whereArgs)
* 第一个参数:表名
* 第二个参数:插入的值
* 第三个参数:选择条件,没有选择条件时填null
* 第四个参数:选择条件的参数 没有参数时填null
* 返回值:修改的行数,如果没有修改,返回0;
*/
ContentValues values = new ContentValues();
values.put("name", "lisi");
values.put("phone", "12345678");
int result = db.update("info", values, null, null);
if (result != 0) {
Toast.makeText(this, "修改了第"+ result + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "修改失败" , Toast.LENGTH_SHORT).show();
}
}
public void query(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
* 第一个参数:表名
* 第二个参数:返回的列 null表示返回所有列
* 第三个参数:选择条件,没有选择条件写null
* 第四个参数:选择条件的参数,没有选择条件参数写null
* 第五个参数:分组条件,没有写null
* 第六个参数:分组条件,没有写null
* 第七个参数:分组条件,没有写null
* 返回值:查询结果的记录的条数
*/
//Cursor cursor = db.query("info", null, null, null,null,null,null);
Cursorcursor=db.query("info",newString[]{"_id","name","phone"},null,null,null,null,null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println(id+" "+name+" "+phone);
}
//释放资源
cursor.close();
db.close();
db.close();
}
}
原文地址:http://blog.csdn.net/ning_xian_hong/article/details/46535289