如何在Android的升级SQLite数据库? [英] How to upgrade SQLite database in Android?

查看:150
本文介绍了如何在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆