一、Sqlite的基本使用
Sqlite的使用主要分为三个步骤:1,构建数据库OpenHelper类;2,获取数据库对象;3,管理并使用数据库。
1,创建SqliteOpenHelper类
public class DataBaseOpenHelper extends SQLiteOpenHelper {
/**
* log日志标记,一般使用当前类类名【便于区分】
*/
private String tag = "DataBaseOpenHelper";
private final static String DB_NAME = "first.db";//数据库名
private final static int VERSION = 1;//版本号
/**
* 构造方法
* <p/>
* Context context 上下文对象
* String name 数据文件对象名称【数据库文件名】
* SQLiteDatabase.CursorFactory factory 游标工厂
* int version 版本,最小为1
*/
public DataBaseOpenHelper(Context context) {
/**
* 当前方法执行创建数据库文件
*/
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {//SQLite中无数据实体类型 varchar(20) 20没有实际的意义
Log.i(tag, "数据库文件被创建了!");
String sql = "create table student(id integer primary key autoincrement,name varchar(20),age int)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/**
* 数据库版本进行升级调用方法
* 用于保证数据库的数据兼容
* 【1-2】 【2-3】 【3-4】
* 会存在【1-3】 【2-4】等情形
*
* 【-------数据兼容处理-----】
*
* 插入数据表格单元列 更新属性等操作
*/
Log.i(tag, "数据库版本更新!");
//tableName 先删除原有表格,再创建新的表格
db.execSQL("DROP TABLE IF EXISTS " + "tableName");
onCreate(db);
}
}
2,获取数据库对象,并将数据库的基本操作封装工具
public class DataBaseDao {
/**
* 数据库文件创建Helper
*/
private DataBaseOpenHelper helper;
public DataBaseDao(Context context) {
helper = new DataBaseOpenHelper(context);
}
/**
* 添加基础信息
*
* @param name 姓名
* @param age 年龄
*/
public void add(String name, int age) {
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into student (name,age) values(?,?)", new Object[]{name, age});
db.close();
}
/**
* 根据核心字段删除对象
*
* @param name 核心字端 name
*/
public void delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from student where name=?", new Object[]{name});
db.close();
}
/**
* 依据关键字段更新信息
*
* @param name
* @param newAge
*/
public void update(String name, int newAge) {
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update student set age=? where name =?", new Object[]{newAge, name});
db.close();
}
/**
* 依据关键字查询相关信息
*
* @param name
* @return
*/
public int find(String name) {
SQLiteDatabase db = helper.getReadableDatabase();
int age = -1;
Cursor cursor = db.rawQuery("select age from student where name=?", new String[]{name});
if (cursor.moveToNext()) {
age = cursor.getInt(1);
}
cursor.close();
db.close();
return age;
}
/**
* 查找全部信息
*
* @return
*/
public List<Student> findAll() {
List<Student> stus = new ArrayList<>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from student", null);
while (cursor.moveToNext()) {
String name = cursor.getString(1);
int age = cursor.getInt(2);
Student stu = new Student();
stu.setName(name);
stu.setAge(age);
stus.add(stu);
}
cursor.close();
db.close();
return stus;
}
}
3,使用系统API更换增删改查
public class DataBaseDaoAPI {
/**
* 数据库文件创建Helper
*/
private DataBaseOpenHelper helper;
public DataBaseDaoAPI(Context context) {
helper = new DataBaseOpenHelper(context);
}
/**
* 添加基础信息
*
* @param name 姓名
* @param age 年龄
* @return 插入数据所在行数
*/
public long add(String name, int age) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
long result = db.insert("student", null, values);
db.close();
return result;
}
/**
* 根据核心字段删除对象
*
* @param name 核心字端 name
* @return 被删除数据的行数,0表示删除失败
*/
public int delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
// String table, String whereClause, String[] whereArgs
int result = db.delete("student", "name=?", new String[]{name});
db.close();
return result;
}
/**
* 依据关键字段更新信息
*
* @param name
* @param newAge
*/
public int update(String name, int newAge) {
SQLiteDatabase db = helper.getWritableDatabase();
// String table, ContentValues values, String whereClause, String[] whereArgs
ContentValues values = new ContentValues();
values.put("age", newAge);
int result = db.update("student", values, "name=?", new String[]{name});
db.close();
return result;
}
/**
* 依据关键字查询相关信息
*
* @param name
* @return
*/
public int find(String name) {
SQLiteDatabase db = helper.getReadableDatabase();
int age = -1;
// Cursor cursor = db.rawQuery("select age from student where name=?", new String[]{name});
// if (cursor.moveToNext()) {
// age = cursor.getInt(1);
// }
// String table, String[] columns,
// String selection, String[] selectionArgs, String groupBy,
// String having, String orderBy, String limit
Cursor cursor = db.query("student", new String[]{"age"}, "name=?", new String[]{name}, null, null, null);
age = cursor.getInt(0);
cursor.close();
db.close();
return age;
}
/**
* 查找全部信息
*
* @return
*/
public List<Student> findAll() {
List<Student> stus = new ArrayList<>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("student", null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(1);
int age = cursor.getInt(2);
Student stu = new Student();
stu.setName(name);
stu.setAge(age);
stus.add(stu);
}
cursor.close();
db.close();
return stus;
}
}
4,使用dos命令查看执行结果
二、ListView的优化【原理--实际使用会抽取成为工具】
1,item复用;
2,inflate--打气筒
3,BaseHolder抽取
4,不同Adapter的使用
常用BaseAdapter
SimpleAdapter ListAdapter
ListAdapter的使用:
public class ListAdapterLV extends Activity {
/**
* ListView主体展示数据
*/
private ListView lvBody;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
lvBody = (ListView) findViewById(R.id.lv_body_item);
String[] data = {"google", "amazon", "facebook"};
lvBody.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_single_choice, data));
lvBody.setItemsCanFocus(true);
lvBody.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
}
SimpleAdapter的使用:
public class SimpleAdapterLV extends Activity {
/**
* ListView主体展示数据
*/
private ListView lvBody;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
/**
* 获取ListView控件
*/
lvBody = (ListView) findViewById(R.id.lv_body_item);
/**
* 获取数据
*/
DataBaseDao dao = new DataBaseDao(this);
ArrayList<Student> students = (ArrayList<Student>) dao.findAll();
/**
* 准备数据
*/
List<Map<String, Object>> lvData = new ArrayList<>();
for (Student student : students) {
Map<String, Object> dataTemp = new HashMap<>();
dataTemp.put("姓名", student.getName());
dataTemp.put("年龄", student.getAge());
lvData.add(dataTemp);
}
/**
* 创建数据适配器
*/
SimpleAdapter adapter = new SimpleAdapter(this, lvData, R.layout.listitem, new String[]{"姓名", "年龄"}, new int[]{R.id.TextView01, R.id.TextView02});
lvBody.setAdapter(adapter);
}
}
SimpleAdapter展示效果:
ListAdapter展示效果:
三、Sqlite事务及扩展
public class MainActivity extends AppCompatActivity {
/**
* 确认转账按钮
*/
private Button enSureTrans;
String s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enSureTrans = (Button) findViewById(R.id.ensure);
OpenHelper helper = new OpenHelper(MainActivity.this);
final SQLiteDatabase db = helper.getWritableDatabase();
String sql = "insert into account (name,money) values('zhangsan',10000) ";
db.execSQL(sql);
enSureTrans.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db.beginTransaction();
try {
db.execSQL("update account set money = money-1000 where name = 'zhangsan'");
// s.equals("success");
db.execSQL("update account set money = money+1000 where name = 'lisi'");
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
});
}
}
结果展示:
四、样式、主题、国际化
样式:values-styles中添加想要的样式,主题类似
<style name="NewStyle">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
国际化:创建不同的values文件夹
推荐他人博客,详细讲解了国际化的实现,记录国际化values命名规则。
国际化注意事项:在程序中不使用说明硬编码,全根据资源文件获取描述。
Resources resources = getResources();//获得res资源对象
Configuration config = resources.getConfiguration();//获得设置对象
DisplayMetrics dm = resources .getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文
resources.updateConfiguration(config, dm);
你引风雨来,我也不怨你,我打着雨伞多少与你同走一程可好?
你带沙尘来,我也不气你,我给我自己蒙上面巾,也给你一块可好?
你要是不愿意,那就算了罢,我自己一人独行,也有许多妙处可得。
你要是高兴,那就更好了,我与你说说这些年,我曾遇的那些人与风景。