设为首页 收藏本站
查看: 924|回复: 0

[经验分享] Android SQLite

[复制链接]

尚未签到

发表于 2016-11-28 10:56:11 | 显示全部楼层 |阅读模式
SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。数据库存储在 data/< 项目文件夹 >/databases/ 下。
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
除了在文件系统中创建数据库,还可以在内存中创建数据库,在对操作速率要求较高的地方就能发挥作用了。
示例:
首先使用继承自SQLiteOpenHelper的数据库辅助类来帮助我们创建和打开数据库

public class MyHelper extends SQLiteOpenHelper {
public static final String TB_NAME = "countrycode";
public static final String ID = "_id";
public static final String COUNTRY = "country";
public static final String CODE = "code";
public MyHelper(Context context, String name,
CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {      
// 创建表countrycode
db.execSQL("CREATE TABLE IF NOT EXISTS "
+ TB_NAME + " ("
+ ID + " INTEGER PRIMARY KEY,"
+ COUNTRY + " VARCHAR,"
+ CODE + " INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {        
//删除以前的旧表,创建一张新的空表,极端  可以使用alert table来修改表
db.execSQL("DROP TABLE IF EXISTS "+TB_NAME);
onCreate(db);
}
}

在Activity中使用该数据库,进行数据的插入,删除,查询,更改,同时也可以使用execSQL完成

public class SQLite2 extends Activity {
public static final String DB_NAME = "code.db";
public static final int VERSION = 1;
MyHelper helper;
SQLiteDatabase db;
Cursor c;
TextView display;
Spinner s;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);      
//初始化数据库辅助对象
helper = new MyHelper(this, DB_NAME, null, VERSION);        
//获得可读写的SQLiteDatabase对象
db = helper.getWritableDatabase();      
//用insert方法像数据库中插入"中国  86"
ContentValues values = new ContentValues();
values.put(MyHelper.COUNTRY, "中国");
values.put(MyHelper.CODE, 86);
db.insert(MyHelper.TB_NAME,MyHelper.ID, values);
//在SQLite数据库中将所有声明为INTEGER PRIMARY KEY的列自动识别为自增列
db.insert(MyHelper.TB_NAME,MyHelper.ID,null);
values.clear();
values.put(MyHelper.COUNTRY, "意大利");
values.put(MyHelper.CODE, 39);
db.update(MyHelper.TB_NAME, values,MyHelper.ID + " = 2",null);      
//使用execSQL方法插入数据"洪都拉斯 504"
db.execSQL("INSERT INTO "
+ MyHelper.TB_NAME + "("
+ MyHelper.COUNTRY + ","
+ MyHelper.CODE + ") VALUES "
+ "('洪都拉斯',504)");
//=====================================   
c = db.query(MyHelper.TB_NAME,null,null,null,null,null,
MyHelper.CODE+" DESC");
final int countryIndex = c.getColumnIndexOrThrow(MyHelper.COUNTRY);
final int codeIndex = c.getColumnIndexOrThrow(MyHelper.CODE);
/*for (c.moveToFirst();!(c.isAfterLast());c.moveToNext()) {
String country = c.getString(countryIndex);
int code = c.getInt(codeIndex);
Toast.makeText(this, country+code,
Toast.LENGTH_LONG).show();
}*/        
//======================================      
s = (Spinner)findViewById(R.id.spinner);
display = (TextView)findViewById(R.id.display);      
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item,
c,
new String[] {MyHelper.COUNTRY},
new int[] {android.R.id.text1});
//设置子控件的布局方式
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
s.setAdapter(adapter);
s.setOnItemSelectedListener(new OnItemSelectedListener(){   
public void onItemSelected(AdapterView<?> adapter,View v,
int pos, long id) {
c.moveToPosition(pos);
display.setText(c.getString(codeIndex));
}      
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}   
@Override
public void onDestroy() {
//程序退出时删除所有行。
db.delete(MyHelper.TB_NAME,null,null);
super.onDestroy();
}
}

Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。你必须知道每一列的数据类型。Cursor 是一个随机的数据源。所有的数据都是通过下标取得。
数据库query的结果是返回一个cursor对象,cursor是位于结果集之上的一个游标,可以对结果集进行向前,向后,或随机的访问,而cursor本身是一个接口,提供了对结果集访问的一些方法。根据功能的不同在其子类有着不同的实现。要控制查询时返回的Cursor类型,可以自定义一个继承自CursorFactory类通过实现其newCursor()方法来返回需要的Cursor子类对象,但在CursorFactory传入null的默认情况下,查询操作会返回一个指向第一行数据之前的SQLiteCursor的对象。
在实际的应用编写过程中,更多是通过适配器(Adapter)来将Cursor与适配器控件联系起来。Android为Cursor提供了一个抽象类CursorAdapter,可以方便实现Cursor与适配器的连接。只需要创建一个继承自CursorAdapter的类,实现其bindView()和newView()两个抽象方法,或根据需要重新实现其他方法就可以用此类来构造一个可适配Cursor的适配器
An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306617-1-1.html 上篇帖子: SQLite 一 下篇帖子: SQLite例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表