吐鲁番市建设局网站,汕头网站制作哪家好,郑州网站开发hndlwx,页面设计快捷键1. SQLite数据库存储
1.1 知识点
#xff08;1#xff09;了解SQLite数据库的基本作用#xff1b;
#xff08;2#xff09;掌握数据库操作辅助类#xff1a;SQLiteDatabase的使用#xff1b;
#xff08;3#xff09;可以使用命令操作SQLite数据库#xff1b;
…1. SQLite数据库存储
1.1 知识点
1了解SQLite数据库的基本作用
2掌握数据库操作辅助类SQLiteDatabase的使用
3可以使用命令操作SQLite数据库
4可以完成数据库的CRUD操作
5掌握数据库查询及Cursor接口的使用。
1.2 具体内容 在Android当中本身提供了一种微型的嵌入式数据库叫做SQLite同样可以执行SQL语句对于不熟悉sql和jdbc的小伙伴还是需要去自学一下。 下面我们首先使用一段代码演示如何取得数据库表操作。
package com.example.sqliteopenhelper;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;public class MySQLiteOpenHelper extends SQLiteOpenHelper {public static final String DATABASENAMEwancy;//数据库名称public static final int DATABASEVERSION1;//版本号public static final String TABLENAME DH10;//数据库表名public MySQLiteOpenHelper(Context context) {super(context, DATABASENAME, null, DATABASEVERSION);// TODO Auto-generated constructor stub}Overridepublic void onCreate(SQLiteDatabase db) {String sql create table TABLENAME (id INTEGER PRIMARY KEY,name VARCHAR(50) NOT NULL,birthday DATE NOT NULL);db.execSQL(sql);}Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {String sql drop table if exists TABLENAME;//当退出的时候删除表db.execSQL(sql);this.onCreate(db);}}以上要注意一点在SQLite当中如果想要让某个字段自动增长那么在创建表的时候使用“INTEGER PRIMARY KEY”声明即可。
那么这样的话一个数据库辅助类已经定义好了那么我们下面在Activity当中去调用此类的方法。
package com.example.sqliteproject;import com.example.sqliteopenhelper.MySQLiteOpenHelper;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;public class SQLiteActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);MySQLiteOpenHelper helper new MySQLiteOpenHelper(this);helper.getWritableDatabase();//表示以读写的形式打开数据库}}现在已经取得了数据库的连接了如果以上代码没有错误运行之后就可以在文件列表当中找到数据表.FileExplorer/data/data/数据库辅助类所在的包/database。根据代码可以发现如果数据库不存在那么会自动调用onCreate方法去创建表如果数据库已经存在了但是版本号发生了改变将会调用onUpgrade方法现将原来的表删除之后在去创建新的表。
·使用SQLite数据库并完成数据库的更新操作。
public void insert(String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象String sql insert into TABLENAME (name,birthday) values (name,birthday);db.execSQL(sql);db.close();}public void update(int id,String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象String sql update TABLENAME set namename,birthdaybirthday where idid;db.execSQL(sql);db.close();}public void delete(int id){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象String sql delete from TABLENAME where idid;db.execSQL(sql);db.close();}以上增删改三个方法写完之后就可以在Activity当中去进行调用。
package com.example.sqliteproject;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;import com.example.sqliteopenhelper.MySQLiteOpenHelper;public class SQLiteActivity extends Activity {MySQLiteOpenHelper helpernull;Button insert,update,del null;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);insert(Button) super.findViewById(R.id.insert);update (Button) super.findViewById(R.id.update);del (Button) super.findViewById(R.id.del);helper new MySQLiteOpenHelper(this);helper.getWritableDatabase();//表示以读写的形式打开数据库insert.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.insert(毛栗子, 1995-01-05);Toast.makeText(SQLiteActivity.this, 新增成功, 0).show();}});update.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.update(1, 大白兔, 1995-01-05);Toast.makeText(SQLiteActivity.this, 修改成功, 0).show();}});del.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.delete(1);Toast.makeText(SQLiteActivity.this, 删除成功, 0).show();}});}}
以上的程序所有数据都是固定的这在实际开发当中显然是不科学的因为我们至少也要使用编辑框进行数据的编辑才是符合实际而且使用字符串拼凑sql这种形式也是存在问题的那么我们可以使用占位符的形式来处理这种问题。
public void insert(String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象java.sql.Date date null;try {date new java.sql.Date(new SimpleDateFormat(yyyy-MM-dd).parse(birthday).getTime());} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}String sql insert into TABLENAME (name,birthday) values (?,?);//使用占位符Object args[] new Object[]{name,birthday};db.execSQL(sql,args);db.close();}对于以上程序只是换了另一种操作方法来解决拼凑的问题功能上没有变化。 对于拼凑sql和使用占位符可以形成一个共识
肯定是使用占位符更好一些。
在android当中还对数据的封装提供了一个ContentValues类。 可以理解为一个Map集合有key和value唯一不同的是ContentValues中的key必须是字符串。以后的操作就可以直接通过key取得value。并将value设置到sql语句当中。
public void insert(String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象ContentValues cv new ContentValues();cv.put(name, name);cv.put(birthday, birthday);db.insert(TABLENAME, null, cv);//进行新增操作db.close();}public void update(int id,String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象ContentValues cv new ContentValues();cv.put(name, name);cv.put(birthday, birthday);String whereClause id?;String whereArgs[] new String[]{String.valueOf(id)};db.update(TABLENAME, cv, whereClause, whereArgs);//更新操作db.close();}public void delete(int id){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象String whereClause id?;String whereArgs[] new String[]{String.valueOf(id)};db.delete(TABLENAME, whereClause, whereArgs);//删除操作db.close();}那么对于使用占位符和ContentValues进行数据库更新操作两种方式并没有严格的优劣之分但是对于不会sql的开发人员来说使用ContentValues更好的。
·数据库查询机Cursor接口 在JDBC中ResultSet接口不呢是的功能就是依靠一个next()方法一动指针向下取数据是到了JDBC2.0之后才能够向上取数据但是我们一般也不去用这种向上取的形式。
Cursor接口出现的比ResultSet晚所有操作机制有些不同。
package com.example.sqliteproject;import java.util.ArrayList;
import java.util.List;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;public class DH10Cursor {private static final String TABLENAMEPR10;private SQLiteDatabase db null;public DH10Cursor(SQLiteDatabase db) {super();this.db db;}public ListString find(){ListString all new ArrayListString();String sql select id,name,birthday from TABLENAME;Cursor result this.db.rawQuery(sql, null);//执行查询语句//采用循环的形式去结果集中的数据for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){all.add(result.getInt(0)result.getString(1)result.getString(2));}result.close();db.close();return all;}
}
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:idid/mylayouttools:context.SQLiteActivity Buttonandroid:idid/insertandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text新增/Buttonandroid:idid/updateandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text修改/Buttonandroid:idid/delandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text删除/Buttonandroid:idid/queryandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text查询//LinearLayout
package com.example.sqliteproject;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;import com.example.sqliteopenhelper.MySQLiteOpenHelper;public class SQLiteActivity extends Activity {MySQLiteOpenHelper helpernull;Button insert,update,del,query null;ListView listView null;LinearLayout myLayout null;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);helper new MySQLiteOpenHelper(this);insert(Button) super.findViewById(R.id.insert);update (Button) super.findViewById(R.id.update);del (Button) super.findViewById(R.id.del);query (Button) super.findViewById(R.id.query);myLayout (LinearLayout) super.findViewById(R.id.mylayout);query.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {SQLiteActivity.this.listView new ListView(SQLiteActivity.this);listView.setAdapter(new ArrayAdapterString(SQLiteActivity.this, android.R.layout.simple_list_item_1,new DH10Cursor(SQLiteActivity.this.helper.getWritableDatabase()).find()));myLayout.addView(listView);}});insert.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.insert(毛栗子, 1995-01-05);Toast.makeText(SQLiteActivity.this, 新增成功, 0).show();}});update.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.update(1, 大白兔, 1995-01-05);Toast.makeText(SQLiteActivity.this, 修改成功, 0).show();}});del.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {helper.delete(1);Toast.makeText(SQLiteActivity.this, 删除成功, 0).show();}});}}
需要注意一下Cursor的下标是从0开始的有别于ResultSet
·模糊查询 ·使用sql语句完成模糊查询
public ListString find(){ListString all new ArrayListString();String sql select id,name,birthday from TABLENAME where name like ?;String args[] new String[]{%栗%};Cursor result this.db.rawQuery(sql, args);//执行查询语句//采用循环的形式去结果集中的数据for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){all.add(result.getInt(0)result.getString(1)result.getString(2));}result.close();db.close();return all;}·使用query方法完成
public ListString find(){ListString all new ArrayListString();//String sql select id,name,birthday from TABLENAME where name like ?;String selection name like ?;String args[] new String[]{%栗%};String columns[] new String[]{id,name,birthday};Cursor result this.db.query(TABLENAME, columns, selection, args, null, null, null);//执行查询语句//采用循环的形式去结果集中的数据for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){all.add(result.getInt(0)result.getString(1)result.getString(2));}result.close();db.close();return all;}既然模糊查询已经能够完成了那么还有一种功能可以往下去实现那就是数据的分页。如果想要实现数据的部分显示这个语句和Mysql中的查询方式是非常相似使用limit完成。下面我们进行一些简单的分页操作。
public ListString find(){int currentPage 1;//当前页码int lineSize 5;//每页显示的数据量ListString all new ArrayListString();String sql select id,name,birthday from TABLENAME limit ?,?;String args[] new String[]{String.valueOf((currentPage-1)*lineSize),String.valueOf(currentPage*lineSize)};Cursor result this.db.rawQuery(sql, args);//采用循环的形式去结果集中的数据for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){all.add(result.getInt(0)result.getString(1)result.getString(2));}result.close();db.close();return all;}·使用ListView来实现滑动分页 Android中有这样一个操作只需要手指进行上下滑动屏幕自动滚动到达最后一条数据的时候提示请稍等数据正在加载......。这个操作需要使用SimpleAdapter来完成因为在这个适配器中有下面这样一个方法。
pulibc void notifyDataSetChanged()
表示如果在SimpleAdapter中的填充数据集合list内容一旦发生变化就会立刻通知ListView进行及时新数据加载当数据加载底部的时候需要提示一个信息而这个信息可以通过ListView组件里的方法去添加
public void addFooterView(View v)
现在还剩下一个问题需要去监听滚动事件需要使用如下接口 首先顶一个ListView的布局模板。
?xml version1.0 encodingutf-8?
TableLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idid/mylayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent TableRow TextView android:idid/idandroid:layout_width50pxandroid:layout_heightwrap_contentandroid:textSize30px/TextView android:idid/nameandroid:layout_width120pxandroid:layout_heightwrap_contentandroid:textSize30px/TextView android:idid/birthdayandroid:layout_width130pxandroid:layout_heightwrap_contentandroid:textSize30px//TableRow/TableLayout
现在我们需进行查询操作需要返回一共有多少笔数据修改一下查询的类
package com.example.sqliteproject;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;public class DH10Cursor {private static final String TABLENAMEDH10;private SQLiteDatabase db null;public DH10Cursor(SQLiteDatabase db) {super();this.db db;}public ListMapString,Object find(int currentPage,int lineSize){ListMapString,Object list new ArrayListMapString,Object();String sql select id,name,birthday from TABLENAME limit ?,?;String args[] new String[]{String.valueOf((currentPage-1)*lineSize),String.valueOf(currentPage*lineSize)};Cursor result this.db.rawQuery(sql, args);for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){MapString,Object map new HashMapString,Object();map.put(id, result.getInt(0));map.put(name, result.getString(1));map.put(birthday, result.getString(2));list.add(map);}return list;}public int getCount(){int count 0;String sql select count(id) from TABLENAME;Cursor result this.db.rawQuery(sql, null);for(result.moveToFirst();!result.isAfterLast();result.moveToNext()){count result.getInt(0);//取得数据的总笔数}return count;}
}
下面写一下主布局文件这个比较简单直接放一个线性布局管理器就可以了。
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idid/mainlayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationvertical /LinearLayout
现在只剩下Activity
package com.example.sqliteproject;import java.util.List;
import java.util.Map;import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;import com.example.sqliteopenhelper.MySQLiteOpenHelper;public class SQLiteActivity extends Activity {MySQLiteOpenHelper helpernull;ListView listView null;LinearLayout mainLayout null;int currentPage 1;int lineSize 5;int count 0;int pageSize 1;//总页数int lastItem 0;//保存最后一个记录点SimpleAdapter adapter null;TextView tv null;//底部信息LinearLayout loadLayout null;//底部提示框布局ListMapString,Object list null;LayoutParams lp new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); super.setContentView(R.layout.listview_main);this.mainLayout(LinearLayout) super.findViewById(R.id.mainlayout);this.loadLayoutnew LinearLayout(this);this.tv new TextView(this);tv.setText(数据加载中请稍后。。。);tv.setGravity(Gravity.CENTER);tv.setTextSize(30);loadLayout.addView(this.tv,this.lp);loadLayout.setGravity(Gravity.CENTER);this.showAllData();}private void showAllData(){this.helper new MySQLiteOpenHelper(this);this.listView new ListView(this);DH10Cursor cursor new DH10Cursor(this.helper.getWritableDatabase());//获得一个查询操作对象this.count cursor.getCount();//取得总数据笔数this.list cursor.find(currentPage, lineSize);this.adapter new SimpleAdapter(this, list, R.layout.listview_item_layout, new String[]{id,name,birthday},new int[]{R.id.id,R.id.name,R.id.birthday});//实例化适配器对象SQLiteActivity.this.listView.addFooterView(SQLiteActivity.this.loadLayout);this.listView.setAdapter(adapter);this.listView.setOnScrollListener(new OnScrollListener() {Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if(SQLiteActivity.this.lastItemSQLiteActivity.this.adapter.getCount()//表示当前记录已经在最底部SQLiteActivity.this.currentPageSQLiteActivity.this.pageSize//当前页要小于总页数scrollStateOnScrollListener.SCROLL_STATE_IDLE//屏幕不再滚动){SQLiteActivity.this.currentPage;SQLiteActivity.this.listView.setSelection(SQLiteActivity.this.lastItem);//设置显示位置SQLiteActivity.this.listView.addFooterView(SQLiteActivity.this.loadLayout);SQLiteActivity.this.appendData();}}Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {SQLiteActivity.this.lastItem firstVisibleItemvisibleItemCount-1;}});mainLayout.addView(this.listView);if(this.count%this.lineSize0){this.pageSize this.count/this.lineSize;}else{this.pageSize this.count/this.lineSize1;}}private void appendData(){//更新数据方法DH10Cursor cursor new DH10Cursor(this.helper.getWritableDatabase());ListMapString,Object newData cursor.find(currentPage, lineSize);this.list.addAll(newData);this.adapter.notifyDataSetChanged();//适配器重新加载集合数据}
}以上就是整个实现下滑屏幕实现分页加载数据的程序。 事务的处理是针对数据库而已以后的开发当中只要针对增删改都需要用事务进行处理。
public void insert(String name,String birthday){SQLiteDatabase db super.getWritableDatabase();//取得数据库操作对象db.beginTransaction();//开启事务try{ContentValues cv new ContentValues();cv.put(name, name);cv.put(birthday, birthday);db.insert(TABLENAME, null, cv);//进行新增操作db.setTransactionSuccessful();//正确执行否则回滚}catch(Exception e){db.endTransaction();//事务关闭db.close();}}1.3 小结
1SQLite数据库是一个专门用于嵌入式设备的数据库
2SQLite支持SQL语句的操作
3可以使用SQLiteOpenHelper类完成数据库的操作
4所有的查询数据使用Cursor进行接收