`
IT阿狸
  • 浏览: 68094 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android——使用SQLite数据库访问

阅读更多

SQLite

 

         SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 TclC#PHPJava等,还有ODBC接口,同样比起MysqlPostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于20005月。至今已经有12个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

 

一、界面


 

 

二、程序包结构


 

 

三、layout中包含2给配置文件,main.xml(里面包含一个ListView控件)和person.xml(与ListView对应的TextView)

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="编号"
            android:textSize="18sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="姓名"
            android:textSize="18sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="年龄"
            android:textSize="18sp" />
    </LinearLayout>

    <ListView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

 

person.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/id"
        android:layout_width="120px"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_margin="3dip"
        android:text="TextView"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/name"
        android:layout_width="180px"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="3dip"
        android:layout_toRightOf="@+id/id"
        android:text="TextView"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/age"
        android:layout_width="50px"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="3dip"
        android:layout_toRightOf="@+id/name"
        android:text="TextView"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

 

 

四、AndroidManifest.xml,配置了Android单元测试

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.e276.db"
    android:versionCode="1"
    android:versionName="1.0" >
	
    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        
         <!-- Android配置单元测试 -->
        <uses-library android:name="android.test.runner" />
        
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <!-- Android配置单元测试 -->
    <instrumentation 
        android:name="android.test.InstrumentationTestRunner" 
        android:targetPackage="org.e276.db" />
    
</manifest>

 

 

五、entity

package org.e276.entity;

/**
 * 实体类
 * 
 * @author miao
 * 
 */
public class Person {

	private Integer id;
	private String name;
	private Integer age;

	public Person() {
		super();
	}

	public Person(Integer id, String name, Integer age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

 

 

六、dao,带一dao辅助类

DBHelper.java

package org.e276.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库辅助类
 * 
 * @author miao
 * 
 */
public class DBHelper extends SQLiteOpenHelper {

	/*
	 * @param context 上下文
	 * 
	 * @param name 数据库名字
	 * 
	 * @param factory 游标工厂对象,没指定就设置为null
	 * 
	 * @param version 版本号
	 */
	// public DBHelper(Context context, String name, CursorFactory factory,
	// int version) {
	// super(context, name, factory, version);
	// }

	private static final String DB_NAME = "ali.db";
	private static final int VERSION = 1;

	public DBHelper(Context context) {
		super(context, DB_NAME, null, VERSION);
	}

	/**
	 * 第一次运行的时候创建
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name text, age INTEGER)");
	}

	/**
	 * 更新的时候
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS person");
		onCreate(db);
	}

}

 

PersonDao.java

package org.e276.dao;

import java.util.ArrayList;
import java.util.List;
import org.e276.entity.Person;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
 * 实现类
 * @author miao
 *
 */
public class PersonDao {

	// 辅助类属性
	private DBHelper helper;

	/**
	 * 带参构造方法,传入context
	 * 
	 * @param context
	 */
	public PersonDao(Context context) {
		helper = new DBHelper(context);
	}

	/**
	 * 使用不同的方法删除记录1到多条记录
	 * 
	 * @param ids
	 */
	public void delete(Integer... ids) {
		String[] c = new String[ids.length];
		StringBuffer sb = new StringBuffer();
		if (ids.length > 0) {
			for (int i = 0; i < ids.length; i++) {
				sb.append('?').append(',');
				// 把整数数组转换哼字符串数组
				c[i] = ids[i].toString();
			}
			// 删除最后一个元素
			sb.deleteCharAt(sb.length() - 1);
		}
		SQLiteDatabase db = helper.getWritableDatabase();
		db.delete("person", "personid in (" + sb.toString() + ")", c);
		db.close();
	}

	/**
	 * 添加纪录
	 * 
	 * @param person
	 */
	public void save(Person person) {
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("insert into person (name,age) values(?,?)", new Object[] {
				person.getName(), person.getAge() });
		db.close();
	}

	/**
	 * 根据id查找
	 * 
	 * @param id
	 * @return
	 */
	public Person find(Integer id) {
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.rawQuery("select * from person where personid=?",
				new String[] { String.valueOf(id) });
		if (cursor.moveToNext()) {
			return new Person(cursor.getInt(0), cursor.getString(1),
					cursor.getInt(2));
		}
		return null;
	}

	/**
	 * 查找所有的记录
	 * 
	 * @return
	 */
	public List<Person> getAll() {
		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = helper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		while (cursor.moveToNext()) {
			persons.add(new Person(cursor.getInt(0), cursor.getString(1),
					cursor.getInt(2)));
		}
		return persons;
	}

	/**
	 * 查询全部
	 * 
	 * @return 游标
	 */
	public Cursor getAllPerson() {
		SQLiteDatabase db = helper.getReadableDatabase();
		// ListView 里的id是有个下划线的,所以这里要给个别名_id
		Cursor cursor = db.rawQuery(
				"select personid as _id, name,age from person", null);
		// 这里数据库不能关闭
		return cursor;
	}

}

 

 

六、Activity类

package org.e276.db;

import org.e276.dao.PersonDao;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

	// 声明ListView对象
	private ListView listView;

	// Dao
	private PersonDao personDao;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 获得listview
		listView = (ListView) findViewById(R.id.listView);
		// 实例化dao
		personDao = new PersonDao(this);
		// 得到所有的记录
		Cursor cursor = personDao.getAllPerson();

		/*
		 * 参数作用:context:显示数据的layout,游标:显示的列名(一定要包含_id),显示的控件id名
		 */
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
				R.layout.person, cursor, new String[] { "_id", "name", "age" },
				new int[] { R.id.id, R.id.name, R.id.age });
		listView.setAdapter(adapter);

		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				ListView lst = (ListView) parent;
				// 得到其中的一行
				SQLiteCursor cursor = (SQLiteCursor) lst
						.getItemAtPosition(position);
				Toast.makeText(MainActivity.this, cursor.getString(1) + "被选中",
						Toast.LENGTH_SHORT).show();
			}
		});
	}

}

 

 

七、test类,导入JUnit3包

package org.e276.test;

import java.util.List;
import java.util.Random;
import org.e276.dao.PersonDao;
import org.e276.entity.Person;
import android.database.Cursor;
import android.test.AndroidTestCase;
import android.util.Log;

/**
 * 测试类 用的是JUnit3,用4可能会报错
 * 
 * @author miao
 * 
 */
public class TestPersonDao extends AndroidTestCase {

	PersonDao personDao = new PersonDao(getContext());

	@Override
	protected void setUp() throws Exception {
		personDao = new PersonDao(getContext());
	}

	/**
	 * 保存
	 */
	public void testSave() {
		for (int i = 1; i <= 30; i++) {
			personDao.save(new Person(-1, "用户" + i, new Random().nextInt(100)));
		}
	}

	/**
	 * 根据id查找
	 */
	public void testFind() {
		Person person = personDao.find(1);
		Log.i("tag", person.toString());
	}

	/**
	 * 查找全部 集合
	 */
	public void testFindAll() {
		List<Person> persons = personDao.getAll();
		for (Person person : persons) {
			Log.i("tag", person.toString());
		}
	}

	/*
	 * 使用命令行查看内嵌数据库 在DOS下输入adb shell,或在sdk下的adb.exe下输入该命令
	 * 
	 * Sqliteman 这个工具,可以打开db文件
	 */

	/**
	 * 查找全部 游标
	 */
	public void testGetAll() {
		Cursor cursor = personDao.getAllPerson();
		while (cursor.moveToNext()) {
			StringBuffer sb = new StringBuffer();
			sb.append("ID:" + cursor.getInt(0));
			sb.append("\t用户名:" + cursor.getString(1));
			sb.append("\t年龄:" + cursor.getInt(2));
			Log.i("person", sb.toString());
		}
	}
	
	/**
	 * 测试删除多条记录
	 */
	public void testDelete(){
		personDao.delete(2,5,9);
	}

}

 

测试时,先运行save方法,向数据库循环添加纪录


 

运行其他方法时,例如testFind(),可以在LogCat里查看得到,前提是添加过滤器。

 

 

八、查看添加了的数据,可以运行app直接查看,又可以在dos控制台下输入命令查看

使用dir命令查看目录结构,然后用cd 目录名进入该目录,直到找到sdk里面的adb.exe为止。

接着使用adb shell命令,打开,出现“#”号代表已经打开了该程序。

ls 代表查看目录。

.help代表查看帮助命令,.tables代表查看数据库的表。

出现sqlite的时候代表可以使用SQL查询语句,增删改都会对数据库产生作用。

 

命令参考图,来自度娘



查询的结果(控制台中出现乱码是正常的,并不影响真正的查询结果):


 

 

九、demo

 Android-DB.zip

 

 

 

 

 

 

  • 大小: 126.1 KB
  • 大小: 20.5 KB
  • 大小: 59 KB
  • 大小: 8.3 KB
  • 大小: 29.2 KB
分享到:
评论
1 楼 chenchangqun 2014-02-13  
很好的SQLlite小例子,感谢分享

相关推荐

    Android源码——数据库SQLite.zip

    这个压缩包文件"Android源码——数据库SQLite.zip"可能包含了关于Android中SQLite数据库的源码分析、使用示例以及相关的图像资源,如1-120912223R80-L.png,可能用于解释或展示SQLite在Android中的工作原理。...

    实验十 使用SQLite数据库存储数据

    3. **内容提供者(Content Provider)**: 虽然不是必须的,但如果你想在多个应用之间共享SQLite数据库的数据,或者使用Android系统的其他组件(如意图Intent)访问数据,可以使用内容提供者。它是Android系统中数据...

    安卓Android源码——连接SQLite数据库源码.zip

    本资料包“安卓Android源码——连接SQLite数据库源码.zip”包含了关于如何在Android应用中连接和操作SQLite数据库的具体源代码示例。 首先,我们来看“源码说明.txt”,这应该包含了对源码的详细解释和使用指导。...

    Android源码——连接SQLite数据库源码.zip

    总的来说,Android连接SQLite数据库涉及的内容包括:`SQLiteOpenHelper`的使用,数据库版本管理,SQL语句的编写,ContentProvider的实现,以及数据操作的方法。这些知识点构成了Android应用中数据持久化的基础,对于...

    Android 绿豆通讯录【SQLite数据库】

     Android 绿豆通讯录( SQLite数据库 + ListView数据展示控件 ) https://blog.csdn.net/weixin_44949135/article/details/106029404 采用 SQLite数据库 + ListView数据展示控件,可将用户添加的所有信息,分条...

    安卓Android源码——数据库SQLite.zip

    【标题】"安卓Android源码——数据库SQLite.zip" 提供的内容主要聚焦于Android操作系统中用于数据存储的SQLite数据库。SQLite是一个轻量级的关系型数据库,它被广泛集成在移动设备和嵌入式系统中,包括Android。这个...

    Android——LitePal操作数据库的案例.rar

    这个“Android——LitePal操作数据库的案例”提供了全面的学习材料,涵盖了从基本的数据库操作到更复杂的场景应用。 首先,我们要理解LitePal的核心功能。LitePal提供了一个快速、方便的方式来映射Java对象到SQLite...

    Android开发:使用sqlite数据库实现记单词APP

    在本项目中,开发者实施了一个基于Android平台的记单词应用,使用SQLite数据库作为数据存储解决方案。以下是关于Android开发和SQLite数据库的关键知识点: 1. **SQLite数据库**:SQLite是Android系统内置的关系型...

    Android 开发中使用 SQLite 数据库

    ### Android开发中使用SQLite数据库详解 #### SQLite简介与特性 SQLite是全球广泛采用的嵌入式数据库系统之一,尤其在移动应用开发领域占有重要地位。它以轻量级、高性能和开源性著称,适用于资源有限的环境。许多...

    安卓开发实验6——SQLite和SQLiteDatabase应用

    在本实验“安卓开发实验6——SQLite和SQLiteDatabase应用”中,我们将深入学习如何在Android应用程序中集成SQLite数据库来存储和检索数据,特别是新闻信息。我们将使用ListView组件来动态地展示这些新闻内容,提供...

    Android代码(sqlite数据库下).zip

    本压缩包文件“Android代码(sqlite数据库下).zip”包含了一个关于SQLite在Android应用中的实践示例——"Pro09(sqlite数据库)",让我们深入探讨其中的知识点。 首先,SQLite在Android中的使用涉及到以下几个核心...

    android的sqlite数据库查看器——sqlitespy1.9

    在Android开发中,SQLite是一个非常重要的组件,它是...总之,SQLiteSpy是一个强大的SQLite数据库管理和调试工具,对于Android开发者来说,它能够极大地提升数据库操作的效率和便利性,帮助优化应用的性能和数据管理。

    安卓Android源码——SqliteManager源码.zip

    在Android开发中,SQLite数据库是广泛使用的轻量级数据库,它为应用程序提供了存储和检索结构化数据的能力。SQLiteManager是Android系统中用于管理SQLite数据库的一个重要工具,其源码对于理解数据库操作、数据存储...

    Android源码——SqliteManager 源码.zip

    SQLiteManager是Android中用于管理SQLite数据库的工具类,它提供了创建、查询、更新和删除数据库表等操作的接口。这份"Android源码——SqliteManager 源码.zip"包含了一些关于SqliteManager的源代码分析以及可能的...

    加解密android数据库sqlite

    总的来说,通过学习和使用如EncryptedSqliteDemo这样的示例,开发者能够了解并掌握在Android应用中实现SQLite数据库加密的方法,从而增强数据的安全性。在实际项目中,结合良好的编码实践和安全策略,可以进一步提升...

    安卓Android源码——Inject增加sqlite3数据库映射注解(ORM).zip

    "Inject增加sqlite3数据库映射注解(ORM)"是一个关于如何在Android项目中使用对象关系映射(ORM)技术来简化SQLite数据库操作的主题。ORM允许开发者用面向对象的方式来处理数据库,减少了直接操作SQL语句的工作量,...

    Android开发——数据库操作

    本篇文章将深入探讨如何在Android中进行SQLite数据库的操作,以实现一个简单的通信录应用为例。 首先,我们需要在Android项目中创建一个SQLite数据库。这通常通过扩展`SQLiteOpenHelper`类来完成。`...

    Android源码——操作数据库实例.zip

    Android提供了SQLite数据库系统,这是一个轻量级的、嵌入式的关系型数据库,适用于移动设备。本实例将深入探讨如何在Android中操作SQLite数据库。 首先,我们需要创建一个SQLite数据库。在Android中,通常通过扩展...

Global site tag (gtag.js) - Google Analytics