如何在Android的升级SQLite数据库? [英] How to upgrade SQLite database in Android?
本文介绍了如何在Android的升级SQLite数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我第一次创建了一个表科指南
。从那以后,我想创建另外两个表供稿
和文章
。
但我看到,创建新表的赞扬从未被执行,为什么?
下面是我的code:
包com.android.database;// ... ...进口公共类DatabaseHelper扩展SQLiteOpenHelper {静态最后弦乐DBNAME =appDB;
静态INT dbVersion = 3;
私有静态最后弦乐DEBPT_TABLE =部;
私有静态最后弦乐COL_DEPT_ID =DEPTID;
私有静态最后弦乐COL_DEPT_NAME =DEPTNAME;
私有静态最后弦乐COL_DEPT_LAT =DeptLat;
私有静态最后弦乐COL_DEPT_LNG =DeptLng;私有静态最后弦乐FEEDS_TABLE =饲料;
私有静态最后弦乐COL_FEED_ID =FEED_ID;
私有静态最后弦乐COL_FEED_TITLE =称号;
私有静态最后弦乐COL_FEED_URL =URL;私有静态最后弦乐ARTICLES_TABLE =公司章程;
私有静态最后弦乐COL_ARTICLE_ID =article_id的;
私有静态最后弦乐COL_ARTICLE_FEED_ID =FEED_ID;
私有静态最后弦乐COL_ATRICLE_TITLE =称号;
私有静态最后弦乐COL_ATRICLE_URL =URL; 公共DatabaseHelper(上下文的背景下){
超(背景下,数据库名,空,dbVersion);
// TODO自动生成构造函数存根
}
@覆盖
公共无效的onCreate(SQLiteDatabase DB){
/ *的onCreate(SQLiteDatabase DB):在创建数据库时调用的,
这是我们可以创建表和列给他们,创建视图或触发器。 * / db.execSQL(CREATE TABLE+ DEBPT_TABLE +
(+ COL_DEPT_ID +INTEGER PRIMARY KEY AUTOINCREMENT,+
COL_DEPT_NAME +TEXT NOT NULL,+
COL_DEPT_LAT +REAL NOT NULL,+
COL_DEPT_LNG +REAL NOT NULL);); db.execSQL(CREATE TABLE+ FEEDS_TABLE +
(+ COL_FEED_ID +INTEGER PRIMARY KEY AUTOINCREMENT,+
COL_FEED_TITLE +TEXT NOT NULL,+
COL_FEED_URL +TEXT_NOT_NULL);); db.execSQL(CREATE TABLE+ ARTICLES_TABLE +
(+ COL_ARTICLE_ID +INTEGER PRIMARY KEY AUTOINCREMENT,+
COL_ARTICLE_FEED_ID +INTEGER NOT NULL,+
COL_ATRICLE_TITLE +TEXT NOT NULL,+
COL_ATRICLE_URL +TEXT NOT NULL););
} @覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
/ * onUpgrade(SQLiteDatabse分贝,INT oldVersion,INT NEWVERSION):当我们做一个修改调用
数据库如改变,丢弃,创建新表。 * / db.execSQL(DROP TABLE IF EXISTS+ DEBPT_TABLE);
db.execSQL(DROP TABLE IF EXISTS+ FEEDS_TABLE);
db.execSQL(DROP TABLE IF EXISTS+ ARTICLES_TABLE);
的onCreate(DB);
} 公共布尔insertDept(系部){
SQLiteDatabase DB = this.getReadableDatabase(); //读打开数据库/写
ContentValues CV =新ContentValues();
cv.put(COL_DEPT_NAME,dept.getName());
cv.put(COL_DEPT_LAT,dept.getLat());
cv.put(COL_DEPT_LNG,dept.getLng()); 长期结果= db.insert(DEBPT_TABLE,COL_DEPT_ID,CV);
//结果是:新插入的行的行号,或-1,如果发生错误
db.close();
返回(结果大于0);
} 公共布尔updateDept(系部){
SQLiteDatabase分贝= this.getReadableDatabase();
ContentValues CV =新ContentValues();
cv.put(COL_DEPT_NAME,dept.getName());
cv.put(COL_DEPT_LAT,dept.getLat());
cv.put(COL_DEPT_LNG,dept.getLng()); INT结果= db.update(DEBPT_TABLE,CV,COL_DEPT_ID +=?,新的String [] {将String.valueOf(dept.getID())});
//字串[] args:WHERE子句的参数
db.close();
返回(结果大于0);
} 公共布尔deleteDept(系部){
SQLiteDatabase分贝= this.getWritableDatabase();
INT重= db.delete(DEBPT_TABLE,COL_DEPT_ID +=?,新的String [] {将String.valueOf(dept.getID())});
db.close();
回报(重大于0);
} 公众的ArrayList<&系GT; getAllDepts(){
ArrayList的<&系GT;科指南=新的ArrayList<&系GT;();
系部= NULL;
SQLiteDatabase分贝= this.getWritableDatabase(); 光标CUR = db.rawQuery(选择+ COL_DEPT_ID +作为_id,+
COL_DEPT_NAME +,+ COL_DEPT_LAT +,+ COL_DEPT_LNG +从+ DEBPT_TABLE,
新的String [] {});
cur.moveToFirst();
而(cur.moveToNext()){
部门=新部门();
dept.setID(cur.getInt(cur.getColumnIndex(_ ID)));
dept.setName(cur.getString(cur.getColumnIndex(COL_DEPT_NAME)));
dept.setLat(cur.getDouble(cur.getColumnIndex(COL_DEPT_LAT)));
dept.setLat(cur.getDouble(cur.getColumnIndex(COL_DEPT_LNG))); depts.add(部门);
}
db.close();
返回科指南;
} 公众诠释GetDeptID(字符串部)
{
SQLiteDatabase分贝= this.getReadableDatabase();
光标C = db.query(DEBPT_TABLE,新的String [] {COL_DEPT_ID +作为_id,COL_DEPT_NAME},
COL_DEPT_NAME +=?,新的String [] {}系,NULL,NULL,NULL);
//光标C = db.rawQuery(选择+ COL_DEPT_ID +作为_id FROM+ DEBPT_TABLE +
//其中+ COL_DEPT_NAME +=,新的String [] {}系)?;
c.moveToFirst();
返回c.getInt(c.getColumnIndex(_ ID));
} 公共布尔insertFeed(字符串标题,网址URL){
SQLiteDatabase分贝= this.getReadableDatabase();
ContentValues值=新ContentValues();
values.put(COL_FEED_TITLE,职称);
values.put(COL_FEED_URL,url.toString());
回报(db.insert(FEEDS_TABLE,空,值)0);
} 公共布尔deleteFeed(供稿){
SQLiteDatabase分贝= this.getReadableDatabase();
返回(db.delete(FEEDS_TABLE,COL_FEED_ID +=+ feed.feedId,空)大于0);
} 公众的ArrayList<饲料和GT; getFeeds(){
SQLiteDatabase分贝= this.getReadableDatabase();
ArrayList的<饲料>提要=新的ArrayList<饲料>();
尝试{
光标C = db.query(FEEDS_TABLE,新的String [] {COL_FEED_ID,COL_FEED_TITLE,
COL_FEED_URL},NULL,NULL,NULL,NULL,NULL); INT其行= c.getCount();
c.moveToFirst();
的for(int i = 0; I<其行; ++ I){
供稿=新饲料();
feed.feedId = c.getLong(0);
feed.title = c.getString(1);
feed.url =新的URL(c.getString(2));
feeds.add(饲料);
c.moveToNext();
}
}赶上(的SQLException E){
Log.e(提要DB,e.toString());
}赶上(MalformedURLException的E){
Log.e(提要DB,e.toString());
}
返回饲料;
} 公共布尔insertArticle(长feedId,字符串标题,网址URL){
SQLiteDatabase分贝= this.getReadableDatabase();
ContentValues值=新ContentValues();
values.put(COL_ARTICLE_FEED_ID,feedId);
values.put(COL_ATRICLE_TITLE,职称);
values.put(COL_ATRICLE_URL,url.toString());
回报(db.insert(ARTICLES_TABLE,空,值)0);
} 公共布尔deleteAricles(长feedId){
SQLiteDatabase分贝= this.getReadableDatabase();
返回(db.delete(ARTICLES_TABLE,COL_ARTICLE_FEED_ID +=+ feedId.toString(),空)大于0);
} 公开名单<物品> getArticles(长feedId){
SQLiteDatabase分贝= this.getReadableDatabase();
ArrayList的<物品>文章=新的ArrayList<物品>();
尝试{
光标C = db.query(ARTICLES_TABLE,新的String [] {的article_id
FEED_ID,标题,URL},
FEED_ID =+ feedId.toString(),NULL,NULL,NULL,NULL); INT其行= c.getCount();
c.moveToFirst();
的for(int i = 0; I<其行; ++ I){
文章文章=新的第();
article.articleId = c.getLong(0);
article.feedId = c.getLong(1);
article.title = c.getString(2);
article.url =新的URL(c.getString(3));
articles.add(条);
c.moveToNext();
}
}赶上(的SQLException E){
Log.e(公司章程DB,e.toString());
}赶上(MalformedURLException的E){
Log.e(公司章程DB,e.toString());
}
返回的物品;
}}
解决方案
您不经过这里的版本号
公共DatabaseHelper(上下文的背景下){ 超(背景下,数据库名,空,dbVersion); // TODO自动生成构造函数存根 }
应该是这样
公共DatabaseHelper(上下文的背景下,字符串DBNAME,空,INT dbVersion)
{ 超(背景下,数据库名,空,dbVersion); // TODO自动生成构造函数存根 }
不要忘了更新版本号
In the first time I have created one Table DEPTS
. After that I want to create another two tables FEEDS
and ARTICLES
.
But I see that the commends for creating new tables never executed, why?
Here is my code:
package com.android.database;
// ... imports ...
public class DatabaseHelper extends SQLiteOpenHelper{
static final String dbName = "appDB";
static int dbVersion = 3;
private static final String DEBPT_TABLE = "Dept";
private static final String COL_DEPT_ID = "DeptID";
private static final String COL_DEPT_NAME = "DeptName";
private static final String COL_DEPT_LAT = "DeptLat";
private static final String COL_DEPT_LNG = "DeptLng";
private static final String FEEDS_TABLE = "feeds";
private static final String COL_FEED_ID = "feed_id";
private static final String COL_FEED_TITLE = "title";
private static final String COL_FEED_URL = "url";
private static final String ARTICLES_TABLE = "articles";
private static final String COL_ARTICLE_ID = "article_id";
private static final String COL_ARTICLE_FEED_ID = "feed_id";
private static final String COL_ATRICLE_TITLE = "title";
private static final String COL_ATRICLE_URL = "url";
public DatabaseHelper(Context context) {
super(context, dbName, null, dbVersion);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
/*onCreate(SQLiteDatabase db): invoked when the database is created,
this is where we can create tables and columns to them, create views or triggers. */
db.execSQL("CREATE TABLE "+DEBPT_TABLE+
"("+COL_DEPT_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
COL_DEPT_NAME+" TEXT NOT NULL, "+
COL_DEPT_LAT+" REAL NOT NULL, "+
COL_DEPT_LNG+" REAL NOT NULL);");
db.execSQL("CREATE TABLE "+ FEEDS_TABLE+
" ("+COL_FEED_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
COL_FEED_TITLE +" TEXT NOT NULL,"+
COL_FEED_URL+" TEXT_NOT_NULL);");
db.execSQL("CREATE TABLE "+ ARTICLES_TABLE+
" ("+COL_ARTICLE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
COL_ARTICLE_FEED_ID+ " INTEGER NOT NULL, "+
COL_ATRICLE_TITLE+" TEXT NOT NULL, "+
COL_ATRICLE_URL+" TEXT NOT NULL);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/*onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): invoked when we make a modification to
the database such as altering, dropping , creating new tables. */
db.execSQL("DROP TABLE IF EXISTS "+DEBPT_TABLE);
db.execSQL("DROP TABLE IF EXISTS "+FEEDS_TABLE);
db.execSQL("DROP TABLE IF EXISTS "+ARTICLES_TABLE);
onCreate(db);
}
public boolean insertDept(Department dept){
SQLiteDatabase db = this.getReadableDatabase();// open database for read/write
ContentValues cv = new ContentValues();
cv.put(COL_DEPT_NAME, dept.getName());
cv.put(COL_DEPT_LAT, dept.getLat());
cv.put(COL_DEPT_LNG, dept.getLng());
long result = db.insert(DEBPT_TABLE, COL_DEPT_ID, cv);
// result : the row ID of the newly inserted row, or -1 if an error occurred
db.close();
return (result>0);
}
public boolean updateDept(Department dept){
SQLiteDatabase db = this.getReadableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_DEPT_NAME, dept.getName());
cv.put(COL_DEPT_LAT, dept.getLat());
cv.put(COL_DEPT_LNG, dept.getLng());
int result = db.update(DEBPT_TABLE, cv,COL_DEPT_ID+"=?", new String []{String.valueOf(dept.getID())});
//String[] args: The arguments of the WHERE clause
db.close();
return (result>0);
}
public boolean deleteDept(Department dept){
SQLiteDatabase db = this.getWritableDatabase();
int re = db.delete(DEBPT_TABLE, COL_DEPT_ID+"=?", new String[]{String.valueOf(dept.getID())});
db.close();
return (re>0);
}
public ArrayList<Department> getAllDepts(){
ArrayList<Department> depts = new ArrayList<Department>();
Department dept = null;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cur = db.rawQuery("SELECT "+COL_DEPT_ID+ " as _id,"+
COL_DEPT_NAME+", "+COL_DEPT_LAT+", "+COL_DEPT_LNG+" from "+DEBPT_TABLE,
new String[]{});
cur.moveToFirst();
while(cur.moveToNext()){
dept = new Department();
dept.setID(cur.getInt(cur.getColumnIndex("_id")));
dept.setName(cur.getString(cur.getColumnIndex(COL_DEPT_NAME)));
dept.setLat(cur.getDouble(cur.getColumnIndex(COL_DEPT_LAT)));
dept.setLat(cur.getDouble(cur.getColumnIndex(COL_DEPT_LNG)));
depts.add(dept);
}
db.close();
return depts;
}
public int GetDeptID(String Dept)
{
SQLiteDatabase db=this.getReadableDatabase();
Cursor c=db.query(DEBPT_TABLE, new String[]{COL_DEPT_ID+" as _id",COL_DEPT_NAME},
COL_DEPT_NAME+"=?", new String[]{Dept}, null, null, null);
//Cursor c=db.rawQuery("SELECT "+COL_DEPT_ID+" as _id FROM "+DEBPT_TABLE+"
//WHERE "+COL_DEPT_NAME+"=?", new String []{Dept});
c.moveToFirst();
return c.getInt(c.getColumnIndex("_id"));
}
public boolean insertFeed(String title, URL url) {
SQLiteDatabase db=this.getReadableDatabase();
ContentValues values = new ContentValues();
values.put(COL_FEED_TITLE, title);
values.put(COL_FEED_URL, url.toString());
return (db.insert(FEEDS_TABLE, null, values) > 0);
}
public boolean deleteFeed(Feed feed) {
SQLiteDatabase db=this.getReadableDatabase();
return (db.delete(FEEDS_TABLE, COL_FEED_ID+ "=" + feed.feedId, null) > 0);
}
public ArrayList<Feed> getFeeds() {
SQLiteDatabase db=this.getReadableDatabase();
ArrayList<Feed> feeds = new ArrayList<Feed>();
try {
Cursor c = db.query(FEEDS_TABLE, new String[] { COL_FEED_ID, COL_FEED_TITLE,
COL_FEED_URL }, null, null, null, null, null);
int numRows = c.getCount();
c.moveToFirst();
for (int i = 0; i < numRows; ++i) {
Feed feed = new Feed();
feed.feedId = c.getLong(0);
feed.title = c.getString(1);
feed.url = new URL(c.getString(2));
feeds.add(feed);
c.moveToNext();
}
} catch (SQLException e) {
Log.e("FEEDS DB", e.toString());
} catch (MalformedURLException e) {
Log.e("FEEDS DB", e.toString());
}
return feeds;
}
public boolean insertArticle(Long feedId, String title, URL url) {
SQLiteDatabase db=this.getReadableDatabase();
ContentValues values = new ContentValues();
values.put(COL_ARTICLE_FEED_ID, feedId);
values.put(COL_ATRICLE_TITLE, title);
values.put(COL_ATRICLE_URL, url.toString());
return (db.insert(ARTICLES_TABLE, null, values) > 0);
}
public boolean deleteAricles(Long feedId) {
SQLiteDatabase db=this.getReadableDatabase();
return (db.delete(ARTICLES_TABLE, COL_ARTICLE_FEED_ID+"=" + feedId.toString(), null) > 0);
}
public List<Article> getArticles(Long feedId) {
SQLiteDatabase db=this.getReadableDatabase();
ArrayList<Article> articles = new ArrayList<Article>();
try {
Cursor c = db.query(ARTICLES_TABLE, new String[] { "article_id",
"feed_id", "title", "url" },
"feed_id=" + feedId.toString(), null, null, null, null);
int numRows = c.getCount();
c.moveToFirst();
for (int i = 0; i < numRows; ++i) {
Article article = new Article();
article.articleId = c.getLong(0);
article.feedId = c.getLong(1);
article.title = c.getString(2);
article.url = new URL(c.getString(3));
articles.add(article);
c.moveToNext();
}
} catch (SQLException e) {
Log.e("ARTICLES DB", e.toString());
} catch (MalformedURLException e) {
Log.e("ARTICLES DB", e.toString());
}
return articles;
}
}
解决方案
You dont pass the version number in here
public DatabaseHelper(Context context) {
super(context, dbName, null, dbVersion);
// TODO Auto-generated constructor stub
}
Should be like this
public DatabaseHelper(Context context, String dbName, null, int dbVersion)
{
super(context, dbName, null, dbVersion);
// TODO Auto-generated constructor stub
}
Dont forget to update your version number
这篇关于如何在Android的升级SQLite数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文