2016-09-23 78 views
0

我最近在包含SQLite數據庫的android應用商店中推出了一款應用。如何使用新的android應用程序更新來更新現有的SQLite數據庫表數據?

我現在正在嘗試發佈應用程序的更新,並且想要將更多數據添加到現有數據庫中,但是已經出現了一些問題。我已經閱讀了關於修改數據庫本身大綱的答案,但是我希望我的表和列保持不變,只添加新數據。

我想要添加到數據庫的數據從CSV文件在Raw文件中,並且最初在用戶註冊該應用程序時加載到數據庫中。

我有一種感覺,我將需要實現onUpgrade方法,但是我應該在這一點上添加CSV文件中的新數據嗎?是否簡單地更新數據庫版本並使用onUpgrade加載新數據?

我對SQLite DB相當新,所以任何幫助將非常感激。

CourseDBHelper代碼

public class CourseDBHelper extends SQLiteOpenHelper { 

// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "CourseDB"; 

// Create two table names 
private static final String TABLE_COURSES = "courses"; 

// Universities Table Columns names 
private static final String COURSE_NAME = "Course_name"; 
private static final String UNI_NAME = "Uni_name"; 
private static final String COURSE_DURATION = "Duration"; 
private static final String COURSE_STUDY_MODE = "Study_mode"; 
private static final String COURSE_QUALIFICATION = "Qualification"; 
private static final String COURSE_ENTRY_STANDARDS = "Entry_standards"; 
private static final String COURSE_GRADUATE_PROSPECTS = "Graduate_prospects"; 
private static final String COURSE_STUDENT_SATISFACTION = "Student_satisfaction"; 


private String CREATE_COURSES_TABLE = "CREATE TABLE courses" + 
     "(" + 
     "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
     "Course_name TEXT NOT NULL," + 
     "Uni_name TEXT NOT NULL," + 
     "Duration TEXT NOT NULL," + 
     "Study_mode TEXT NOT NULL," + 
     "Qualification TEXT NOT NULL," + 
     "Entry_standards TEXT NOT NULL," + 
     "Graduate_prospects TEXT NOT NULL," + 
     "Student_satisfaction TEXT NOT NULL" + 
     ");"; 

private static final String[] COLUMNS = { 
     COURSE_NAME, 
     UNI_NAME, 
     COURSE_DURATION, 
     COURSE_STUDY_MODE, 
     COURSE_QUALIFICATION, 
     COURSE_ENTRY_STANDARDS, 
     COURSE_GRADUATE_PROSPECTS, 
     COURSE_STUDENT_SATISFACTION 
}; 

public CourseDBHelper(Context context) 
{ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// TODO: REMOVED NOT NULL FROM EVERY COLUMN FOR TEST PURPOSES, WILL NEED TO BE READDED 
@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL(CREATE_COURSES_TABLE); 
} 

public void deleteAll() 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete("courses", null, null); 
    db.execSQL("delete from " + "courses"); 
    db.close(); 
} 

// Getting one course by course name and uni name 
public Course getCourse(String courseName, String uniName) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_COURSES, COLUMNS, " Course_name = ? AND Uni_name = ?", 
      new String[]{courseName, uniName}, 
      null, 
      null, 
      null, 
      null); 

    if (cursor != null) 
     cursor.moveToFirst(); 


    Course course = new Course(); 

    /* 

    System.out.println(cursor.getString(0)); 
    System.out.println(cursor.getString(1)); 
    System.out.println(cursor.getString(2)); 
    System.out.println(cursor.getString(3)); 
    System.out.println(cursor.getString(4)); 
    System.out.println(cursor.getString(5)); 
    System.out.println(cursor.getString(6)); 
    */ 

    course.setCourseName(cursor.getString(0)); 
    course.setUniversity(cursor.getString(1)); 
    course.setCourseDuration(cursor.getString(2)); 
    course.setStudyMode(cursor.getString(3)); 
    course.setQualification(cursor.getString(4)); 
    course.setEntryStandards(cursor.getString(5)); 
    course.setGradProspects(cursor.getString(6)); 
    course.setStudentSatisfaction(cursor.getString(7)); 


    return course; 

} 

public void addCourse(Course course) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 

    values.put(COURSE_NAME, course.getCourseName()); 
    values.put(UNI_NAME, course.getUniversity()); 
    values.put(COURSE_DURATION, course.getCourseDuration()); 
    values.put(COURSE_STUDY_MODE, course.getStudyMode()); 
    values.put(COURSE_QUALIFICATION, course.getQualification()); 
    values.put(COURSE_ENTRY_STANDARDS, course.getEntryStandards()); 
    values.put(COURSE_GRADUATE_PROSPECTS, course.getGradProspects()); 
    values.put(COURSE_STUDENT_SATISFACTION, course.getStudentSatisfaction()); 

    db.insert(TABLE_COURSES, 
      null, //nullColumnHack 
      values); 

    db.close(); 
} 


public ArrayList<Course> getAllCourses() 
{ 
    ArrayList<Course> courses = new ArrayList<>(); 
    // 1. build the query 
    String query = "SELECT * FROM " + TABLE_COURSES; 
    // 2. get reference to writable DB 
    SQLiteDatabase db = this.getWritableDatabase(); 

    Cursor cursor = db.rawQuery(query, null); 

    // 3. go over each row, build course and add it to list 
    Course course; 
    if(cursor.moveToFirst()){ 
     cursor.moveToNext(); 
     do{ 
      course = new Course(); 
      course.setCourseName(cursor.getString(1)); 
      course.setUniversity(cursor.getString(2)); 
      course.setCourseDuration(cursor.getString(3)); 
      course.setStudyMode(cursor.getString(4)); 
      course.setQualification(cursor.getString(5)); 
      course.setEntryStandards(cursor.getString(6)); 
      course.setGradProspects(cursor.getString(7)); 
      course.setStudentSatisfaction(cursor.getString(8)); 

      // Add course to courses list 
      courses.add(course); 
     } while(cursor.moveToNext()); 
    } 

    // return courses 
    return courses; 
} 

public int getDBCount() 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String count = "SELECT count(*) FROM courses"; 
    Cursor mcursor = db.rawQuery(count, null); 
    mcursor.moveToFirst(); 
    int icount = mcursor.getInt(0); 
    return icount; 
} 

public void deleteCourse(Course course) { 

    // 1. get reference to writable DB 
    SQLiteDatabase db = this.getWritableDatabase(); 

    // 2. delete 
    db.delete("courses", //table name 
      "Course_name = ? AND Uni_name = ?", // selections 
      new String[] { course.getCourseName(), course.getUniversity() }); //selections args 

    // 3. close 
    db.close(); 
} 



@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 


} 
} 

方法,從CSV加載數據文件對於SQLite數據庫

public void populateCourseDatabase(int id) { 

     // NOW POPULATE THE COURSE DATABASE FILE 
inputStream = getResources().openRawResource(R.raw.coursesone); 


     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     String word; 
     String cvsSplitBy = ","; 

     try{ 
      while((word = reader.readLine()) != null){ 

       Log.d(TAG, "constructing Course object from: " + word); 

       String[] segment = word.split(cvsSplitBy); 

       Course course = new Course(); 
       course.setCourseName(segment[0]); 
       course.setUniversity(segment[1]); 
       course.setCourseDuration(segment[2]); 
       course.setStudyMode(segment[3]); 
       course.setQualification(segment[4]); 
       course.setEntryStandards(segment[5]); 
       course.setGradProspects(segment[6]); 
       course.setStudentSatisfaction(segment[7]); 


       myCourseDBHelper.addCourse(course); 

       progressBar.setProgress(count); 

       count = count + 1; 

       System.out.println("Sucessfully added: " + course.toString()); 
      } 
     } 
     catch(IOException e1){ 
      e1.printStackTrace(); 
      System.out.println("SOMETHING WENT WRONG"); 
     } 

    } 

回答

1

SQLiteOpenHelper的onCreate()和onUpgrade()回調被調用時,數據庫實際上是打開,例如通過調用getWritableDatabase()。onCreate()僅在數據庫文件不存在並剛剛創建時運行。只有當數據庫文件存在但存儲的版本號低於constructor中的請求時才調用onUpgrade()。增加數據庫版本以便調用onUpgrade()。 示例僞代碼如下

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

    case 1: 
     //upgrade logic from version 1 to 2 
    case 2: 
     //upgrade logic from version 2 to 3 
    case 3: 
     //upgrade logic from version 3 to 4 
     break; 
    default: 
     throw new IllegalStateException(
     "onUpgrade() with unknown oldVersion " + oldVersion); 
    } 
} 
+0

感謝您的答覆。有沒有一種方法可以告訴用戶擁有哪個數據庫版本,即;如果用戶正在更新應用程序,請將新數據添加到數據庫,但是如果用戶第一次安裝,請將所有數據添加到數據庫? – freshwaterjoe

+0

您需要更改在擴展SqliteOpen Helper的Database類中的OnCreate方法中傳遞的版本號。當安裝新版本的應用程序時,它會調用OnUpgrade(..)方法,在這裏寫下所有的查詢。 –

+0

再次感謝您的幫助,我開始明白您的意思。所以我需要將類頂部的'DATABASE_VERSION' int增加到2,然後編寫一個'if else'語句,說'如果DATABASE_VERSION == 2 {//添加所有新數據'。我在正確的路線? – freshwaterjoe