woong's

Android 어플 런칭후 DB 수정시 주의해야할 점 본문

Develop/Android

Android 어플 런칭후 DB 수정시 주의해야할 점

dlsdnd345 2016. 2. 14. 00:24

Android 어플 런칭후 DB 수정시 주의해야할 점


 

   


이번에 북트리 도서관리 어플을 런칭하고 저의 짧은 지식으로 인한 사용자들에게 불편한점을 끼친 사건이 있었습니다 .


그것은 바로 어플 업데이트를 통해 좀더 좋은 서비스와 기능을 제공하려다 보니 DB 수정이 있었습니다 .

정말 취지는 좋았습니다 .하지만 여기서 문제가 있었습니다 .


1.1.1 버젼을 쓰는 사용자는 기존의 추가 되지 않은 DB 를 사용하다가 업데이트 DB를 받았을 경우 에러가 나타나는 일이 

생겼습니다 .


여기에 대해서 어떻게 해결해야 할지 모르고 있었습니다 . 이것때문에 문제가 발생했는데 어떻게 해결해야하지 ? 가 의문이였습니다 . 하지만 역시 저와 같은 경험을 하신분들이 있었네요..


저와 같은 경험을 하신분들의 글을 통해 해결을 할수 있었습니다 .


저또한 저와 같은 분들이 생기지 않도록 예방하고자 이렇게 포스트를 쓰고 있습니다 .



정답은 바로 여기 있었습니다 !!!!!!!!!!!!!!!!!!!!


sqlLite 의 버젼과 , 버젼별 update() 를 통해서 해결 할수 있습니다 .

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.iw.sqlhelper;
 
import java.sql.SQLException;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
 
import com.iw.entities.Book;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
 
public class BookSqlHelper extends OrmLiteSqliteOpenHelper {
 
    private static final String NAME = "Book.db";
    private static final int VERSION = 1;
 
    private Dao<Book, Integer> bookDao = null;
 
    public BookSqlHelper(Context context) {
        super(context, NAME, null, VERSION);
    }
 
    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        try {
            TableUtils.createTable(connectionSource, Book.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource,
            int oldVersion, int newVersion) {
        
        try {
            TableUtils.dropTable(connectionSource, Book.classtrue);
            onCreate(database, connectionSource);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    public Dao<Book, Integer> getBookDao() {
        if (null == bookDao) {
            try {
                bookDao = getDao(Book.class);
            } catch (java.sql.SQLException e) {
                e.printStackTrace();
            }
        }
        return bookDao;
    }
}
 

 

 

저의 짧은 지식으로 인한 문제가 되었던 코드 입니다 .


저는 우선 DB의 버젼관리를 하고 있지 않았습니다 .


제일 중요한 opUpgrade 메서드 역시 DB을 삭제하고 다시 만드는 일을 하고있습니다 .

이코드를 통해 사용자에게 신뢰를 잃었지만 이해해주시고 계속 사용해주시는 분들 덕분에 

이렇게 문제를 찾고 고치려 노력할수 있는것 같습니다.


우선 이 문제가 있는 코드를 수정 해야 합니다 .


해당 버젼의 기준을 잡고 변경이 있을때 마다 DB 버젼을 올려주어야 합니다 .

올려준 버젼을 통해서 onUpgrade() 에서 버젼 관리를 해주어야 합니다 .


1
2
3
4
5
6
7
8
switch(oldVersion) {
case 1:
  //필드 추가
 //내용 추가
case 2:
  //필드 추가
 //내용 추가
        }



이와 같이 1버젼에 대한 DB 필드를 추가 하고 푸가한 필드의 데이터 값을 넣어주는 방식을 사용해야 합니다 .


여기서 주의할 점이 하나 더 있습니다 .


1버젼을 쓰는 사용자가 2버젼 업데이트를 하지 않고서 3버젼으로 바로 업데이트를 하는 경우

switch 문의 break 문이 있으면 2버젼에 대한 업데이트가 진행되지 않아 오류가 생깁니다 .


그래서 switch 문의 break 문이 없는것을 눈여겨 보셔야 합니다 .

 

이렇게 DB 관리를 하면 사용자에게 좀더 나은 서비스와 기능을 제공해주면서 에러가 없고 불편함이 없는 

어플을 만들수 있는것 같습니다 .


앞으로 저와 같으신 분이 생기지 않았으면 좋겠습니다 ^^:;;;






Comments