当前位置:首页 » 安卓系统 » onupgradeandroid

onupgradeandroid

发布时间: 2022-07-08 06:22:34

1. android 怎么读取数据库中的数据

android读取数据库可以使用sqlite一些api进行读取,实例如下:

java">/**
*查找一条数据
*@paramuid
*/
publicUserfind(Integeruid){
SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();//创建数据库辅助类
Cursorcursor=db.rawQuery("select*fromuserwhereuid=?",newString[]{uid.toString()});//创建一个游标
if(cursor.moveToFirst()){//循环遍历查找数组
intuid2=cursor.getInt(cursor.getColumnIndex("uid"));
Stringuname=cursor.getString(cursor.getColumnIndex("uname"));
Stringuaddress=cursor.getString(cursor.getColumnIndex("uaddress"));
Useruser=newUser();
user.setUid(uid2);
user.setUname(uname);
user.setUaddress(uaddress);
returnuser;
}
cursor.close();
returnnull;
}

2. 求帮助,android实例化数据库问题

在上一个例子中,我们对Android系统自带的SQLite数据库进行了初步的学习,了解了一些增、删、改、查的基本工作。在这一节的例子当中,我们做了一个非常简便的日记本程序,虽然没有完善,但是已经是基本可以使用了。在例子当中,我们不但要对数据库进行增、删、改、查的操作,而且还要把数据库当中的数据显示在一个ListView当中,通过对ListView的操作,实现对数据的增、删、改、查操作。

通过这个例子我们可以学到以下操作:

如何对DatabaseHelper和SQLiteDatabase封装,以便让我们访问数据库更加方便和安全;

如何利用ContentValues类来代替原始的SQL语句进行数据库的操作;

如何使用SimpleCursorAdapter类和ListView配合进行ListView的显示。

日记本具体实现步骤如下所述。

1.第一步

在Eclipse中打开ex08_2_SQLite 项目,具体操作步骤如下。

新建一个项目。单击File→New→Android Project项。

在新建项目的对话框中,选择Create project from existing source项。

单击浏览,找到ex08_2_SQLite项目,然后单击确定。

程序的目录结构如图8-16所示。

2.第二步

我们首先运行一下建立的程序,将会出现如图8-17所示。

(点击查看大图)图8-16 程序的目录结构

(点击查看大图)图8-17 没有任何数据的程序主界面

程序的主Activity是ActivityMain,它是一个ListActivity,和它关联的布局文件是diary_list.xml。关于ListActivity的介绍。请参阅第7章关于ListView的介绍。

3.第三步

在继续操作前,让我们重点关注一下DiaryDbAdapter类,这个类封装了DatabaseHelper和SQLiteDatabase类,使得我们对数据库的操作更加安全和方便。

在DiaryDbAdapter的类变量里,主要定义了以下几个变量:

数据库、数据表、数据表中列的名字;

DatabaseHelper 和SQLiteDatabase的实例;

Context 实例。

DatabaseHelper 类的定义和上一个例子一样,只不过这个例子里边,我们在onUpgrade增加了升级的代码,具体如下所示:

private static class DatabaseHelper extends SQLiteOpenHelper {

DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

//生成数据库

db.execSQL(DATABASE_CREATE);

@Override

public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS diary");

onCreate(db);
}
}
代码解释:

在DiaryDbAdapter类里,向外界提供了以下一些方法。

open(),调用这个方法后,如果数据库还没有建立,那么会建立数据库,如果数据库已经建立了,那么会返回可写的数据库实例。

close(),调用此方法,DatabaseHelper 会关闭对数据库的访问。

createDiary(String title, String body)通过一个title和body字段在数据库当中创建一条新的纪录。

deleteDiary(long rowId)通过记录的id,删除数据库中的那条记录。

getAllNotes()得到diary表中所有的记录,并且以一个Cursor的形式进行返回。

getDiary(long rowId)通过记录的主键id,得到特定的一条记录。

updateDiary(long rowId, String title, String body)更新主键id为rowId那条记录中的两个字段title和body字段的内容。

小知识 什么是ContentValues类?

ContentValues类和Hashtable比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个String类型,而值都是基本类型。

我们回顾一下,在上一个例子当中,我们是通过SQL语句进行插入操作,SQL语句的好处是比较直观,但是容易出错。但是在这个例子当中我们有更好的办法,在这里我们将要插入的值都放到一个ContentValues的实例当中,然后执行插入操作,具体代码如下所示:

public long createDiary(String title, String body) {

ContentValues initialValues = new ContentValues();

initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();

// 生成年月日字符串

String created = calendar.get(Calendar.YEAR)
+"年"+calendar.get(Calendar. MONTH)+"月"+calendar.get
(Calendar.DAY_OF_MONTH)+"日"+calendar.get(Calendar.
HOUR_OF _DAY)+"时"+calendar.get(Calendar.MINUTE)+"分";

initialValues.put(KEY_CREATED, created);

return mDb.insert(DATABASE_TABLE, null, initialValues);

}
代码解释:

ContentValues initialValues = new ContentValues()语句实例化一个contentValues类。

initialValues.put(KEY_TITLE, title)语句将列名和对应的列值放置到initialValues里边。

mDb.insert(DATABASE_TABLE, null, initialValues)语句负责插入一条新的纪录,如果插入成功则会返回这条记录的id,如果插入失败会返回-1。

在更新一条记录的时候,我们也是采用ContentValues 的这套机制,具体代码如下所示:

public boolean updateDiary(long rowId, String title, String body) {

ContentValues args = new ContentValues();

args.put(KEY_TITLE, title);
args.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();

String created = calendar.get(Calendar.YEAR) + "年"

+ calendar.get(Calendar.MONTH) + "月"

+ calendar.get(Calendar.DAY_OF_MONTH) + "日"

+ calendar.get(Calendar.HOUR_OF_DAY) + "时"

+ calendar.get(Calendar.MINUTE) + "分";

args.put(KEY_CREATED, created);

return mDb.update(DATABASE_TABLE, args,
KEY_ROWID + "=" + rowId, null) > 0;

}
代码解释:

实现更新一条记录。

4.第四步

现在返回到程序的主界面,对应的Activity是ActivityMain。

当我们单击menu按钮后会出现如图8-18所示界面。

根据我们第7章对menu的学习,对单击menu里边按钮的处理逻辑全部放在onMenuItem Selected函数里,具体代码如下所示:

public boolean onMenuItemSelected(int featureId, MenuItem item) {

switch (item.getItemId()) {

case INSERT_ID:

createDiary();

return true;

case DELETE_ID:

mDbHelper.deleteDiary(getListView().getSelectedItemId());
renderListView();

return true;

}

return super.onMenuItemSelected(featureId, item);

}
代码解释:

如果单击添加一篇新日记按钮那么会执行到createDiary()语句。

如果单击删除一条记录,会执行mDbHelper.deleteDiary(getListView().getSelectedItemId())语句,首先删除当前被选中的某一项所对应的数据库当中的记录。

renderListView()语句重新对界面刷新。

在createDiary()函数里边的代码如下所示:

private void createDiary() {

Intent i = new Intent(this, ActivityDiaryEdit.class);

startActivityForResult(i, ACTIVITY_CREATE);
}
代码解释:

首先构造了一个intent,这个intent负责跳转到ActivityDiaryEdit里。

然后启动这个intent,并且需要返回值。

5.第五步

在ActivityMain中,有多处地方都用到了renderListView()函数。在onCreate里边用这个函数显示ListView。当ListView需要发生变化后,例如,删除了一条记录或者增加了一条记录的时候,我们调用这个函数进行刷新ListView,下边来看一下此函数的实现,具体代码如下所示:

private void renderListView() {
mDiaryCursor = mDbHelper.getAllNotes();
startManagingCursor(mDiaryCursor);

String[] from = new String[] { DiaryDbAdapter.KEY_TITLE,

DiaryDbAdapter.KEY_CREATED };

int[] to = new int[] { R.id.text1, R.id.created };

SimpleCursorAdapter notes = new SimpleCursorAdapter(this,

R.layout.diary_row, mDiaryCursor, from, to);
setListAdapter(notes);
}
代码解释:

mDiaryCursor = mDbHelper.getAllNotes()语句,我们首先获取数据库当中的所有数据,这些数据以Cursor的形式存在。

startManagingCursor(mDiaryCursor)语句,我们将生成的Cursor交给Activity来管理,这样的好处是系统能自动做很多事情,比如当程序暂停的时候,这个系统可以卸载Cursor以节省空间,当程序重新启动的时候系统重新查询生成Cursor。

String[] from 里边定义了ListView每一排对应的数据是从数据库中的哪个列表里选取。

和SimpleAdapter类似 int[] to 里边是一个View的数组。这些View只能是TextView或者ImageView。这些View是以id的形式来表示的,如Android.R.id.text1。

SimpleCursorAdapter notes = new SimpleCursorAdapter(this,R.layout.diary_row, mDiaryCursor, from, to)语句生成一个SimpleCursorAdapter ,我们介绍以下每一个参数的意义。

第一个参数是Context。

第二个参数为R.layout.diary_row,它关联在diary_row.xml文件当中定义的Layout,这个Layout规定ListView当中每一项的布局。

第三个参数就是Cursor。

第四个参数是数据表当中的列的数组,只有在这里边出现的列名,数据才会对应的填充在to里边对应的TextView或者ImageView当中。

第五个参数是在ListView里边每一项中需要被数据填充的TextView或者ImageView。

setListAdapter(notes)语句将SimpleCursorAdapter 和ListActivity里边的ListView绑定起来,至此在界面当中才会显示出列表来。

小知识 什么是SimpleCursorAdapter ?

在第7章,我们已经介绍过了ArrayAdapter和SimpleAdapter。和它们俩类似,SimpleCursorAdapter 也是集成Adapter。ArrayAdapter负责把一个字符串数组中的数据填充到一个ListView当中,而对应的SimpleCursorAdapter 负责把Cursor里边的内容填充到ListView当中。通过SimpleCursorAdapter 可以把数据库当中一列的数据和ListView中一排进行对应起来。和前两个Adapter类似,要求和数据进行对应的View必须是TextView或者ImageView。

6.第六步

单击添加一条数据的按钮,程序运行界面如图8-19所示。

这个界面对应的Activity是ActivityDiaryEdit,对应的布局文件是diary_edit.xml。对于这个布局文件里边用到了LinearLayout、TextView和EditText,这些我们都已经讲过,在这里不再赘述,具体看一下代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"

Android:orientation="vertical" Android:layout_width="fill_parent"

Android:layout_height="fill_parent">

<LinearLayout Android:orientation="vertical"

Android:layout_width="fill_parent"

Android:layout_height="wrap_content">

<TextView Android:layout_width="wrap_content"

Android:layout_height="wrap_content" Android:text="@string/title"

Android:padding="2px" />

<EditText Android:id="@+id/title"

Android:layout_width="fill_parent"

Android:layout_height="wrap_content" Android:layout_weight="1" />

</LinearLayout>

<TextView Android:layout_width="wrap_content"

Android:layout_height="wrap_content" Android:text="@string/body" />

<EditText Android:id="@+id/body" Android:layout_width="fill_parent"

Android:layout_height="wrap_content" Android:layout_weight="1"

Android:scrollbars="vertical" />

<Button Android:id="@+id/confirm" Android:text="@string/confirm"

Android:layout_width="wrap_content"

Android:layout_height="wrap_content" />

</LinearLayout>
代码解释:

在一个LinearLayout里边我们放置了一些文本框、输入框和一些Button按钮。

当程序运行输入内容后,单击确定按钮,日记就会保存到数据库当中。下边来看一下代码具体是怎么执行的。当单击确定按钮后,系统回调执行和按钮绑定的单击监听器里边的onClick方法,具体代码如下所示:

public void onClick(View view) {
String title = mTitleText.getText().toString();
String body = mBodyText.getText().toString();

if (mRowId != null) {

mDbHelper.updateDiary(mRowId, title, body);

} else

mDbHelper.createDiary(title, body);

Intent mIntent = new Intent();

setResult(RESULT_OK, mIntent);
finish();
}
代码解释:

首先获得EditView里边的数据。

目前mRowId 为null,所以执行mDbHelper.createDiary(title, body)语句将数据保存到数据当中。

setResult(RESULT_OK, mIntent)语句设置返回值。

执行完上边的代码后,系统跳转到ActivityMain,并执行回调函数onActivityResult,具体代码如下所示:

protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {

super.onActivityResult(requestCode, resultCode, intent);

renderListView();
}
代码解释:

在回调函数中,我们重新对ListView进行刷新,将所有的数据重新显示出。

7.第七步

单击ListView里边的条列,可以对刚才保存的数据进行编辑。具体怎么实现这个功能的,我们可以看一下ActivityMain当中的onListItemClick方法代码:

protected void onListItemClick(ListView l,
View v, int position, long id) {

super.onListItemClick(l, v, position, id);

Cursor c = mDiaryCursor;
c.moveToPosition(position);

Intent i = new Intent(this, ActivityDiaryEdit.class);

i.putExtra(DiaryDbAdapter.KEY_ROWID, id);
i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString
(c .getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));
i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString
(c .getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);
}
代码解释:

c.moveToPosition(position)语句将在Cursor当中的指针移到position位置,这个position是我们单击的这个一列在整个列表中的位置。

Intent i = new Intent(this, ActivityDiaryEdit.class)语句构造一个跳转到ActivityDiaryEdit的intent。

putExtra()方法负责将要传递的数据放到intent当中。

c.getString(c.getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE))得到这一条数据中列名为title的值。

c.getString(c.getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY))得到这一条数据中列名为body的值。

startActivityForResult(i, ACTIVITY_EDIT)语句启动intent,发生Activity的跳转。

我们来看一下ActivityDiaryEdit中的onCreate()里边的代码:

Bundle extras = getIntent().getExtras();

if (extras != null) {

String title = extras.getString(DiaryDbAdapter.KEY_TITLE);
String body = extras.getString(DiaryDbAdapter.KEY_BODY);
mRowId = extras.getLong(DiaryDbAdapter.KEY_ROWID);

if (title != null) {

mTitleText.setText(title);
}

if (body != null) {

mBodyText.setText(body);
}
}
代码解释:

对于ActivityDiaryEdit这个Activity有两个intent可以跳转进来,一个是新建一篇日记的时候,这个时候intent里边的extras部分没有任何数据。第二种情况是在单击列表的某一个条列的时候,这个时候的intent如上所示会携带extras数据。所以在ActivityDiaryEdit中我们通过判断extras是否为null,就可以判断是哪种intent启动的。

当extras不为null,我们将extras里边的数据显示出来。

8.第八步

在程序的主界面当中,上下移动焦点(可以通过键盘的上下键或者模拟器中的上下按键),可以对拥有焦点的那一项进行删除,如图8-20、图8-21、图8-22所示。

(点击查看大图)图8-20 上下移动焦点界面
具体执行onMenuItemSelected中的代码:

mDbHelper.deleteDiary(getListView().getSelectedItemId());
renderListView();
代码解释:

getListView()方法获取当前的ListView引用。

getSelectedItemId()方法得到当前这一列所对应的数据项的rowId,也就是这条数据在数据库中的主键id。

(点击查看大图)图8-21 进行删除界面

(点击查看大图)图8-22 删除后界面

mDbHelper.deleteDiary()方法删去数据库中的这一列数据。

renderListView()负责对列表重新刷新一遍。

至此,对数据库的学习就先告一段落,接下来将学习contentProvider,它是Android应用当中非常重要的一部分。而且程序间的大部分数据交换都是通过contentProvider机制进行。

3. android中在onupgrade可以执行插入数据操作吗

当然正常情况下,我们都会传入一个数据库文件名的,所以这个方法一般不会执行的,那么就走下面的代码。下面的代码就是直接打开一个数据库。不过我们看到一个特点,就是创建数据库和Context有关系呢。我们看一下Context中的代码。不过这里我们知道Context是一个抽象类,我们一般会看他的子类ContextImpl实现:
主要看一下getDatabasePath方法和openOrCreateDatabase方法:
首先来看一下openOrCreateDatabase方法:

[java] view plain
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
DatabaseErrorHandler errorHandler) {
File f = validateFilePath(name, true);
int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
}
SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
setFilePermissionsFromMode(f.getPath(), mode, 0);
return db;
}
这里我们看到其实还是调用了SQLiteDatabase的openDatabase方法

4. android 数据库升级会清空以前存的数据吗

Android应用程序更新的时候如果数据库修改了字段需要更新数据库,并且保留原来的数据库数据:
这是原有的数据库表
CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";
然后我们增加一个字段:
CREATE_BOOK = "create table book(bookId integer primarykey,bookName text,bookContent text);";
首先我们需要把原来的数据库表重命名一下
CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
然后把备份表中的数据到新创建的数据库表中
INSERT_DATA = "insert into book select *,' ' from _temp_book";(注意' '是为新加的字段插入默认值的必须加上,否则就会出错)。
然后我们把备份表干掉就行啦。
DROP_BOOK = "drop table _temp_book";
然后把数据库的版本后修改一下,再次创建数据库操作对象的时候就会自动更新(注:更新的时候第一个创建的操作数据的对象必须是可写的,也就是通过这个方法getWritableDatabase()获取的数据库操作对象)
然后在onUpgrade()方法中执行上述sql语句就OK了
public class DBservice extends SQLiteOpenHelper{
private String CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";
private String CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
private String INSERT_DATA = "insert into book select *,'' from _temp_book";
private String DROP_BOOK = "drop table _temp_book";
public DBservice(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 2:
db.execSQL(CREATE_TEMP_BOOK);
db.execSQL(CREATE_BOOK);
db.execSQL(INSERT_DATA);
db.execSQL(DROP_BOOK);
break;
}
}

5. android 版本更新后数据库会清空吗

这个不会的,Android版本的更新会把之前的数据保存起来的。

6. Android 数据库如何更新

1、设置一个DB_VERSION

publicstaticfinalintDB_VERSION=1;

2、当你要更新表的时候就把DB_VERSION+1,就会触发onUpgrade,数据库就更新了,记得采纳

publicDBHelper(){
//fortest
Config=newDbManager.DaoConfig()
.setDbName(DB_NAME)
.setDbVersion(DB_VERSION)
.setDbDir(Environment.getExternalStorageDirectory())
.setDbOpenListener(newDbManager.DbOpenListener(){
@Override
publicvoidonDbOpened(DbManagerdb){
db.getDatabase().enableWriteAheadLogging();
}
})
.setDbUpgradeListener(newDbManager.DbUpgradeListener(){
@Override
publicvoidonUpgrade(DbManagerdb,intoldVersion,intnewVersion){
updateTable(db,xx.class);

}
});
}

7. 将开发的android app 安装到手机上后,如何在如见代码中替换手机上原有的数据库

android sqlite数据库,第一次调用getWritableDatabase或者getReadableDatabase后,就会在程序的包下创建一个数据库,之前执行SQLiteOpenHelper的onCreate方法,
当数据库创建了以后,是不会再创建的,只有通过升级数据库版本号来实现
当数据库的版本号发生了变化以后,SQLiteOpenHelper会调用onUpgrade方法
因此都是在onUpgrade来处理新增字段,新增表等操作

要替换数据库
将原来数据库放到res/raw目录下,程序启动的时候,通过流读取了来,并写到你程序目录下
String dbfile = "/data"+ Environment.getDataDirectory().getAbsolutePath() + "/"+ context.getPackageName()+"数据库名"
InputStream is = context.getResources().openRawResource(R.raw.data);

FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[1024];
int count = 0;
while ((count =is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
fos.flush();
}
fos.close();
is.close();
这样就把数据库给替换了,但是通常不建议这么做
最好是在onUpgrade来处理

请采纳哈

8. Android中复写SQLiteOpenHelper的onUpgrade()方法为什么不写代码

因为数据库结构没跟随数据库版本迭代

9. android SQLiteDatabase中的update函数用法是什么

1·创建数据库Android
不自动提供数据库。在
Android
应用程序中使用
SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android
提供了
SQLiteOpenHelper
帮助你创建一个数据库,你只要继承
SQLiteOpenHelper
类,就可以轻松的创建数据库。
2·SQLiteOpenHelper
类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper
的子类,至少需要实现三个方法:构造函数,调用父类
SQLiteOpenHelper
的构造函数。
3·这个方法需要四个参数:
上下文环境(例如,一个
Activity),
数据库名字,
一个可选的游标工厂(通常是
Null),
一个代表你正在使用的数据库模型版本的整数。onCreate()方法,它需要一个
SQLiteDatabase
对象作为参数,根据需要对这个对象填充表和初始化数据。onUpgrage()
方法,它需要三个参数,一个
SQLiteDatabase
对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
public
class
DatabaseHelper
extends
SQLiteOpenHelper
{
DatabaseHelper(Context
context,
String
name,
CursorFactory
cursorFactory,
int
version)
{
super(context,
name,
cursorFactory,
version);
}
@Override
public
void
onCreate(SQLiteDatabase
db)
{
//
TODO
创建数据库后,对数据库的操作
}
@Override
public
void
onUpgrade(SQLiteDatabase
db,
int
oldVersion,
int
newVersion)
{
//
TODO
更改数据库版本的操作
}

super.onOpen(db);

//
TODO
每次成功打开数据库后首先被执行
}
}
复制代码接下来讨论具体如何创建表、插入数据、删除表等等。

热点内容
gpu并行编程 发布:2025-04-09 13:55:07 浏览:147
termux桌面服务器设置ip 发布:2025-04-09 13:52:05 浏览:304
x8f源码 发布:2025-04-09 13:52:04 浏览:105
安卓手机如何把原图的马赛克去掉 发布:2025-04-09 13:41:06 浏览:245
如何修改网银U盾密码 发布:2025-04-09 13:30:40 浏览:196
安卓渠道服怎么更换账号 发布:2025-04-09 13:29:54 浏览:549
linux读取文件c 发布:2025-04-09 13:29:44 浏览:327
python字符串追加 发布:2025-04-09 13:26:48 浏览:796
学之书数据库 发布:2025-04-09 13:26:07 浏览:639
粉碎数据库 发布:2025-04-09 13:21:02 浏览:701