zoukankan      html  css  js  c++  java
  • android 数据操作之SQLite

    SQLite 是android 嵌入式数据库,是典型的关系型数据库,支持我们常用的数据类型,支持标准的sql语句。

    SQLite 在嵌入式数据库中经常使用,如词霸中就在sqlite3.dll ,是一个单一文件,不需要安装,就可以直接使用。

    在android 系统中我们需要extends 一个抽象类SQLiteOpenHelper 实现它默认的方法。

    • public void onCreate(SQLiteDatabase db) {} 应用到首次使用时创建数据库及表结构
    • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}是软件数据库版本更新时调用的方法,注意数据不就应该丢失。
    Android  项目中使用SQLiter 数据库
    第一步:编写一个实体类要继承 SQLiteOpenHelper
    第二步:给这个实体类添加一个构造器(必须)
    第三步:重写onCreate(SQLiteDatabase db); 第一次使用数据库时创建表结构。
            重写onUpgrade(SQLiteDatabase db,in oldVersion,int newVersion);在数据库升级时重新创建数据库。
    第四步:常用代码。
            SQLiteDatabase db  = this.getReadableDatabase();  获取一个可读的数据库。
            SQLiteDatabase db =  this.getWriteableDatabase();获取一个可写的数据库。
            Cursor cursor = db.query(tableName,...);
            ContentValues cv = new ContentValues(); // 内容的值的集合

    具体的类(CRUD)实现如下:
    package com.hkrt.server;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.hkrt.domain.Person;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class PersonHelper extends SQLiteOpenHelper {
        private static final String DBNAME="hkrt.db";
        private static final String TABLENAME="person";
        private static final String ID="id";
        private static final String NAME="name";
        private static final Integer VERSION=1;
    	public PersonHelper(Context context) {
    		super(context, DBNAME, null, VERSION);
    	}
    
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		String sql="create table "+TABLENAME+"  ("+ID+" INTEGER primary key autoincrement,"+NAME+" varchar(20))";
    		db.execSQL(sql);
    	}
    
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		
    	}
    	// 添加数据到指定的数据库表中	
       public long insert(String text){
    	   SQLiteDatabase db =this.getWritableDatabase();
    	   ContentValues values = new ContentValues();
    	   values.put(NAME, text);
    	   long row = db.insert(TABLENAME, null, values);
    	   return row;
       }
       //修改指定的数据库表数据
       public long update(int id){
    	   SQLiteDatabase db =this.getWritableDatabase();
    	   ContentValues values = new ContentValues();
    	   values.put(NAME, "李四");
    	   String where = ID + " = ?";
    	   String[] whereValue = { Integer.toString(id) };
    	   long row=  db.update(TABLENAME, values, where, whereValue);//返回受影响的行数标识
    	  return row;
    	   
       }
       //删除指定数据库中的表数据记录   
       public long delete(int id){
    	   SQLiteDatabase db = this.getWritableDatabase();
    	   String whereClause=ID+"=?";
    	   String[] whereArgs = { Integer.toString(id) };
    	   long row =  db.delete(TABLENAME, whereClause, whereArgs);
    	  return row;
       }
       //查询列表数据
       public List<Person> find(){
    	   List<Person> list = new ArrayList<Person>();
    	   Person person;
    	   SQLiteDatabase db = this.getWritableDatabase();
    	   Cursor cursor = db.query(TABLENAME, null, null, null, null, null, null);
    	   while(cursor.moveToNext()){
    		   person= new Person();
    		   int id = cursor.getInt(0);
    		   String name = cursor.getString(1);
    		   person.setId(id);
    		   person.setName(name);
    		   if(person!=null){
    			   list.add(person);			   
    		   }
    	   }
    	   cursor.close();
    	   db.close();
    	   return list;
       }
    
    }
    

    测试代码:
    package com.hkrt.db;
    
    import java.util.List;
    
    import android.test.AndroidTestCase;
    import android.util.Log;
    
    import com.hkrt.domain.Person;
    import com.hkrt.server.PersonHelper;
    
    public class PersonTest  extends AndroidTestCase {
    	String TAG="PersonTest";
    	public void testCreateDB(){
    		PersonHelper helper = new PersonHelper(this.getContext());
    //		helper.getWritableDatabase();// 创建数据库
    		
    		System.out.println(helper.insert("格林斯"));
    		Log.i(TAG,String.valueOf(helper.insert("google")));//插入新的数据
    		
    //		System.err.println(helper.update(1));//更新数据
    //		System.err.println(helper.delete(1));//删除数据
    		List<Person> persons = helper.find();//查询所有数据
    		for(Person p:persons){
    			System.err.println(p.toString());
    		}
    		//	分页查询是使用和mysql 相同,关键字limit
    	}
    	
    }
    
    通常我们做CUD 时,要做事务的处理:
    // 添加数据到指定的数据库表中	
       public long insert(String text){
    	   SQLiteDatabase db =this.getWritableDatabase();
    	   ContentValues values = new ContentValues();
    	   values.put(NAME, text);
    	   
    	   db.beginTransaction();//开始事务
    	   long row;
    	   try{
    		   row = db.insert(TABLENAME, null, values);
    		   db.setTransactionSuccessful();
    	   }finally{
    		   db.endTransaction();
    	   }
    	 
    	   return row;
       }


    注:要添加测试权限。
    生成的数据库在\data\data\<package.name>\databases\ 下。
    可以把生成的数据库导出,查看其结构和数据,这里推荐一个sqlite 工作, sqlite develoption 


    添一张查询结果数据的图吧:


    也可以在dos命令下进入linux 控制后台。查询sqlite3数据。
    第一步:我们需要进行android-sdk-windows 的目录下。再进入tools 或platform-tools 查询adb.exe 

    注:由于 版本的不同adb.exe 在不同的目录下。
    具体见下图:


    如果数据库中有中文,会有问题是数据编码问题。

    android sqlite3 工具类可以直接修改并使用。
    package com.hkrt.sql;
    
    import java.util.ArrayList;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    
    import com.hkrt.domain.User;
    import com.hkrt.domain.UserEnum;
    
    /**
     * 使用方式:</br>
     * dbHelper = new DBHelper(this);</br>
     * dbHelper.open();</br>
     * 处理数据</br>
     * dbHelper.close()</br>
     * @data   2010-11-12
     */
    
    public class DBHelper
    {
    	//sqlite支持NULL Integer real text blob类型,注意该类的所有数据库操作的异常都没有处理
    	private Context context;
    	private SQLiteDatabase dbInstance;
    	private DBCreator dbCreator;
    	private static final String DB_NAME = "db_user";
    	private static final int DB_VERSION = 1;
    	
    	public static final String TABLE_NAME="user";
    	public static final String COLUMN_ID = "user_id";
    	public static final String COLUMN_NAME="user_name";
    	public static final String COLUMN_AGE="user_age";
    	public static final String COLUMN_SEX="user_sex";
    	public static final String COLUMN_TYPE = "user_type";
    	
    	private static final String CREATE_TABLE= new StringBuffer().append("Create table ").append(TABLE_NAME)
    								.append(" (")
    								.append(COLUMN_ID).append(" integer primary key,")
    								.append(COLUMN_NAME).append(" varchar(20) not null,")
    								.append(COLUMN_AGE).append(" text not null,")
    								.append(COLUMN_SEX).append(" text not null,")
    								.append(COLUMN_TYPE).append(" integer not null)")
    								.toString();
    	public DBHelper(Context context)
    	{
    		this.context = context;
    	}
    	public void open()
    	{
    		//第一次,android系统发现数据库没有创建,会调用onCreate方法,以后就只是返回数据库的一个引用
    		dbCreator = new DBCreator(context,DB_NAME,null,DB_VERSION,CREATE_TABLE,TABLE_NAME);
    		dbInstance = dbCreator.getWritableDatabase();
    	}
    	public void close()
    	{
    		dbCreator.close();
    	}
    	public void insert(ContentValues values)
    	{
    		dbInstance.insert(TABLE_NAME, null, values);
    	}
    	public void update(ContentValues values,String whereClause,String[] whereArgs)
    	{
    		dbInstance.update(TABLE_NAME, values, whereClause, whereArgs);
    	}
    	public void delete(String whereClause, String[] whereArgs)
    	{
    		dbInstance.delete(TABLE_NAME, whereClause, whereArgs);
    	}
    	/**
    	 * 查询
    	 * @param sql SQL语句,参数用?占位
    	 * @param selectionArgs 参数?的值数组
    	 * @return Cursor游标,注意,和JDBC的ResultSet一样,是在线数据集,所以处理完之前,不能调用close()
    	 */
    	public Cursor query(String sql, String[] selectionArgs)
    	{
    		return dbInstance.rawQuery(sql, selectionArgs);
    	}
    	public ArrayList<User> getQueryAccountList(String sql,String[] args)
    	{
    		ArrayList<User> accoutList = new ArrayList<User>();
    		open();
    		Cursor cursor = query(sql, args);
    		while (cursor.moveToNext()) {
    			User user = new User();
    			user.setId(cursor.getInt(0));
    			user.setName(cursor.getString(1));
    			user.setAge(cursor.getString(2));
    			user.setSex(cursor.getString(3));
    			user.setType(UserEnum.getUserEnum(cursor.getInt(4)));
    			accoutList.add(user);
    		}
    		//注意游标必须要关闭,否则多查询几次就会出现异常
    		if(!cursor.isClosed())
    		{
    			cursor.close();
    		}
    		close();
    		return accoutList;
    	}
    	/**通过Id获取唯一user*/
    	public User getUserById(int id){
    		User user =null;
    		String sql="select * from "+TABLE_NAME +" where " + COLUMN_ID +" = ?";
    		ArrayList<User> users = getQueryAccountList(sql,new String[]{String.valueOf(id)});
    		if(users!=null){
    			user= new User(); 
    			user.setId(users.get(0).getId());
    			user.setName(users.get(0).getName());
    			user.setAge(users.get(0).getAge());
    			user.setSex(users.get(0).getSex());
    			user.setType(users.get(0).getType());
    		}
    		return user;
    	}
    	/**
    	 * 模糊查询
    	 */
    	public ArrayList<User> getQueryAccountListLike(String str){
    		ArrayList<User> accoutList = new ArrayList<User>();
    		open();
    		StringBuffer sb = new StringBuffer();
    		sb.append("select * from ").append(TABLE_NAME).append(" where ").append(COLUMN_NAME).append(" like ").append("'"+str +"%'");
    		Cursor cursor =	dbInstance.rawQuery(sb.toString(), new String[]{});
    		while (cursor.moveToNext()) {
    			User user = new User();
    			user.setId(cursor.getInt(0));
    			user.setName(cursor.getString(1));
    			user.setAge(cursor.getString(2));
    			user.setSex(cursor.getString(3));
    			user.setType(UserEnum.getUserEnum(cursor.getInt(4)));
    			accoutList.add(user);
    		}
    		//注意游标必须要关闭,否则多查询几次就会出现异常
    		if(!cursor.isClosed())
    		{
    			cursor.close();
    		}
    		close();
    		return accoutList;	
    	}
    	
    
    	private class DBCreator extends SQLiteOpenHelper
    	{
    		private Context context;
    		private String createTableSql;
    		private String tableName;
    		
    
    		public DBCreator(Context context, String dbname, CursorFactory factory,
    				int version,String createTableSql,String tableName)
    		{
    			super(context, dbname, factory, version);
    			this.context = context;
    			this.createTableSql = createTableSql;
    			this.tableName = tableName;
    		}
    
    		@Override
    		public void onCreate(SQLiteDatabase db)
    		{
    			db.execSQL(createTableSql);
    		}
    
    		@Override
    		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    		{
    			db.execSQL("drop table if exists "+tableName);
    			onCreate(db);
    		}
    	}
    }
    


  • 相关阅读:
    阿里云OSS学习
    spring学习(十二)--spring中WebApplicationInitializer解析
    spring学习(十)--WebApplicationInitializer接口替代web.xml启动spring容器
    tomcat学习(二)--tomcat配置详解
    tomcat学习(一)--tomcat请求过程
    WEB工程中web.xml文件基本配置
    MAVEN学习(九)--利用nexus创建私服供上传下载jar包
    NGINX学习(九)--nginx配置示例
    Django所有ORM总结
    ORM一般操作
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218357.html
Copyright © 2011-2022 走看看