Android数据库基本操作(附源码)


数据库是程序开发中重要的知识点,A ndroid采用的数据库是 SQLite 这个轻量级的嵌入式开源数据库, 数据库基本的操作就是先创建表,再对表中的数据进行"增,删,改,插".

1,创建表

通过execSQL方法来执行一条SQL语句。

String sql = "CREATE TABLE dota (_id INTEGER , heroname VARCHAR,description VARCHAR)";
db.execSQL(sql);
上面就创建了一个表名为"dota"的表,有3列,分别是"INTEGER"数据类型的"id"列,"VARCHAR"数据类型的"heroname"列,

"VARCHAR"数据类型的"description"列

语法结构是:Create TABLE 表名(列名 此列数据类型,列名 此列数据类型,列名 此列数据类型)


补充:在创建表时,还可以把第一列Id设置为主键,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值

String sql = "CREATE TABLE dota (_id INTEGER PRIMARY KEY AUTOINCREMENT, heroname VARCHAR,description VARCHAR)";
db.execSQL(sql);

大家可以用这2种方式创建表试下,就可以理解区别了.上传的源代码中是没有加入"PRIMARY KEY AUTOINCREMENT"的

关于详细的解释,可以看下面朋友发的文章

点击打开链接


2,增加数据

2种方法

ContentValues cv = new ContentValues();	
cv.put("heroname", "幽鬼");
cv.put("description", "1号位");
db.insert(table_name, "", cv);
db.execSQL("INSERT INTO dota(heroname, description) values('幽鬼', '1号位')");
第二种方法固定语法结构:INSERT INTO 表名(列名, 列名) values(键值, 键值)


3,删除数据

2种方法

db.delete(table_name, "description = '5号位'", null);
db.execSQL("delete from dota where description=?",new Object[]{"5号位"});
第二种方法固定语法结构:"delete from 表名 where 列名=?",new Object[]{键值}


4,修改数据

2种方法

cv.put("heroname", "神牛");
cv.put("description", "8号位");
db.update(table_name, cv, "heroname = '神牛'", null);
db.execSQL("update dota set description=? where heroname=?",new String[]{"8号位", "神牛"});
第二种方法固定语法结构:"update 表名 set 列名=? where 列名=?",new String[]{"要修改的键值", "键值"}


5,查询数据

2种方法

Cursor c = db.query(table_name, null, null, null, null, null, null);
Cursr c = db.rawQuery("select * from dota", null);
第二种方法固定语法结构:"select"表中哪一行查询或者全表查询,返回一个游标,这里查询的是表中所有数据

除了了解数据库的基本操作语句外,还需要明白SQLiteOpenHelper类和SQLiteDatabase类.

SQLiteOpenHelper帮助你创建一个数据库你只要继承 SQLiteOpenHelper类就可以轻松的创建数据库。SQLiteOpenHelper类根据开发应用程序的需要封装了创建和更新数据库使用的逻辑。

SQLiteOpenHelper 的子类,至少需要实现三个方法:

  构造函数,调用父类 SQLiteOpenHelper 的构造函数

  onCreate()方法;// TODO 创建数据库后,对数据库的操作

  onUpgrage()方法。// TODO 更改数据库版本的操作

SQLiteDatabase是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作.例如上面的代码中的"db"就是SQLiteDatabase类的对象.

下面直接贴代码:

DbHelper.java

package com.example.mysqliteactivity;

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

public class DbHelper extends SQLiteOpenHelper{

	public DbHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		String sql = "CREATE TABLE dota (_id INTEGER , heroname VARCHAR,description VARCHAR)";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	}

}


MainActivity,java
package com.example.mysqliteactivity;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	//SQLiteDatabase对象
	SQLiteDatabase db;
	//数据库名
	public String db_name = "huahua.sqlite";
	//表名
	public String table_name = "dota";
	//辅助类名
	final DbHelper helper = new DbHelper(this,db_name,null,1);
	//保存数据库中英雄名字的ArrayList
	public ArrayList<String> heronames =new ArrayList<String>(); 
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		db.delete(table_name, null, null);
		UpdateSpinner();
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//UI组件
		Button b1 = (Button)findViewById(R.id.Button01);
		Button b2 = (Button)findViewById(R.id.Button02);
		Button b3 = (Button)findViewById(R.id.Button03);
		Button b4 = (Button)findViewById(R.id.Button04);
		
		//从辅助类获得数据库对象
		db = helper.getWritableDatabase();
		
		//初始化数据
		initDatabase(db);
		
		//更新下拉列表数据
		UpdateSpinner();
		
		//定义按钮点击监听器
		OnClickListener ocl = new OnClickListener() {
			ContentValues cv = new ContentValues();
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				switch(v.getId()){
					//增加按钮
				case R.id.Button01:
//					cv.put("heroname", "随机英雄");
//					cv.put("description", "6号位");
//					long long1 = db.insert(table_name, "", cv);
					db.execSQL("INSERT INTO dota(heroname, description) values(?, ?)",new Object[]{"随机英雄", "6'号'位"});
					
					//添加成功后返回行号,添加失败后返回-1
//					if(long1 == -1){
//						Toast.makeText(MainActivity.this, "ID是"+long1+"的图片添加失败", Toast.LENGTH_LONG).show();
//					}else{
//						Toast.makeText(MainActivity.this, "ID是"+long1+"的图片添加成功", Toast.LENGTH_LONG).show();
//					}
					
					//更新下拉列表
					UpdateSpinner();
					break;
					
					//删除描述是"图片5"的数据行
				case R.id.Button02:
					//删除方法
//					long long2 = db.delete(table_name, "description = '5号位'", null);
					db.execSQL("delete from dota where description=?",new Object[]{"5号位"});//这里删除的是"术士"项
					
					//删除失败返回0,成功返回删除的条数
//					Toast.makeText(MainActivity.this, "删除了"+long2+"条记录", Toast.LENGTH_LONG).show();
					
					//更新下拉列表
					UpdateSpinner();
					break;
					
					//更新文件名是"5.png"的数据行
				case R.id.Button03:
//					cv.put("heroname", "神牛");
//					cv.put("description", "8号位");
//					long long3 = db.update(table_name, cv, "heroname = '神牛'", null);
					db.execSQL("update dota set description=? where heroname=?",new String[]{"8号位", "神牛"});
					
					//更新失败返回0,成功返回更新的条数
//					Toast.makeText(MainActivity.this, "更新了"+long3+"条记录", Toast.LENGTH_LONG).show();
					
					//更新下拉列表
					UpdateSpinner();
					break;
					
					//查询当前所有数据
				case R.id.Button04:
					//查询表中所有元素
//					Cursor c = db.query(table_name, null, null, null, null, null, null);
					Cursor c = db.rawQuery("select * from dota", null); 
					//查询指定的元素
//					Cursor c = db.rawQuery("select * from dota where heroname=? ", new String[]{"修补匠"}); 
//					Cursor c = db.rawQuery("select * from dota where heroname= ? and description=?", new String[]{"修补匠","2号位"}); 
					
					//Cursor.getCount是记录的条数
					Toast.makeText(MainActivity.this, "当前共有"+c.getCount()+"条记录,下面一一显示", Toast.LENGTH_SHORT).show();
					
					//循环显示
					for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
						Toast.makeText(MainActivity.this,
								"第"+c.getInt(0)+"条记录,英雄是"+c.getString(1)+",位置是"+c.getString(2),
								Toast.LENGTH_SHORT).show();
						
					//更新下拉列表
//					UpdateSpinner();
					}
					
					//更新下拉列表
					UpdateSpinner();
					break;
				}
				
			}
		};
		
		b1.setOnClickListener(ocl);
		b2.setOnClickListener(ocl);
		b3.setOnClickListener(ocl);
		b4.setOnClickListener(ocl);
	}

	private void UpdateSpinner() {
		// TODO Auto-generated method stub
		//定义组件;
		final TextView tv = (TextView)findViewById(R.id.TextView02);
		Spinner s = (Spinner)findViewById(R.id.Spinner01);
		
		//从数据库中获取数据放入游标Cursor对象
		final Cursor c = db.query(table_name, null, null, null, null, null, null);

		heronames.clear();
		for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
			heronames.add(c.getString(1));
		}
		
//		//创建简单游标适配器
//		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
//				android.R.layout.simple_spinner_item, 
//				c, 
//				new String[]{"heroname","description"},
//				new int[]{R.id.TextView01,R.id.TextView02});
		
		//创建Spinner的适配器
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,heronames);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		
		//给下拉列表设置适配器
		s.setAdapter(adapter);
		
		//设置点击子元素监听器
		OnItemSelectedListener oisl = new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
				c.moveToPosition(arg2);
				tv.setText("当前英雄位置描述为:" + c.getString(2));
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		};
		
		//给下拉列表设置监听器
		s.setOnItemSelectedListener(oisl);
	}

	private void initDatabase(SQLiteDatabase db) {
		// TODO Auto-generated method stub
//		ContentValues cv = new ContentValues();
//		
//		cv.put("heroname", "幽鬼");
//		cv.put("description", "1号位");
//		db.insert(table_name, "", cv);
//		
//		cv.put("heroname", "修补匠");
//		cv.put("description", "2号位");
//		db.insert(table_name, "", cv);
//		
//		cv.put("heroname", "发条");
//		cv.put("description", "3号位");
//		db.insert(table_name, "", cv);
//		
//		cv.put("heroname", "神牛");
//		cv.put("description", "4号位");
//		db.insert(table_name, "", cv);
		
//		cv.put("heroname", "术士");
//		cv.put("description", "5号位");
//		db.insert(table_name, "", cv);
		
		//用execSQL语法操作更方便,如果传入带'单引号的特殊符号字符串要用以下结构,不然会出现语法错误
		db.execSQL("insert into dota(heroname, description) values(?,?)", new Object[]{"幽鬼", "1号'位"}); 
//		db.execSQL("INSERT INTO dota(heroname, description) values('幽鬼', '1号'位')");//这句导致程序崩溃!!!
		db.execSQL("INSERT INTO dota(heroname, description) values('修补匠', '2号位')");
		db.execSQL("INSERT INTO dota(heroname, description) values('发条', '3号位')");
		db.execSQL("INSERT INTO dota(heroname, description) values('神牛', '4号位')");
		db.execSQL("INSERT INTO dota(heroname, description) values('术士', '5号位')");
	}

}

就只有2个类,如有错误或者疑问的地方,大家可以指出来一起纠正,讨论

以下是源码的下载地址

点击打开链接




发布了21 篇原创文章 · 获赞 8 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhangxuebing2/article/details/12574529