듀다의 성장개발로그

[부스트코스] 안드로이드 프로그래밍 23 - 데이터베이스(3) 본문

안드로이드/부스트코스

[부스트코스] 안드로이드 프로그래밍 23 - 데이터베이스(3)

du-da 2020. 3. 13. 19:39

이번 포스팅에서는 데이터베이스 헬퍼의 사용과 인터넷 연결 상태를 확인하는 방법에 대해 다루겠습니다.

데이터베이스를 사용하는 앱을 유지 관리하다 보면 데이터베이스에 칼럼을 추가하거나 변경하는 등 데이터베이스를 업데이트 해야 하는 경우가 있을 것입니다,

테이블을 삭제하고 다시 만들면 쉽게 업데이트가 가능하겠지만

이미 해당 데이터베이스를 사용하는 사람이 많다면, 테이블을 삭제했을 때 그 유저들의 정보까지 삭제되겠죠.

테이블을 새로 만드는 대신 헬퍼 클래스를 사용할 수 있습니다.

 

    class DatabaseHelper extends SQLiteOpenHelper {
        public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
        
        }

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

        }
    }

오픈헬퍼 클래스를 이너 클래스로 선언했습니다.

오픈헬퍼가 기존에 설치되어 있는 데이터가 있는지, 데이터베이스의 버전이 무엇인지 확인합니다. 데이터가 존재하면 onUpgrade, 없으면 onCreate를 호출합니다.

onCreate에는 테이블을 새로 생성하는 코드, onUpgrade에는 변경하는 코드를 넣어주면 되겠습니다.

 

    public void openDatabase(String databaseName) {
        println("openDatabase() 호출됨.");
        DatabaseHelper helper = new DatabaseHelper(this, databaseName, null, 3);
        database = helper.getWritableDatabase();
    }

앱에서 데이터베이스를 사용하게 되었으므로 데이터베이스를 최초로 생성하거나 오픈할 때에도 기존의 코드 대신 오픈헬퍼를 활용할 수 있습니다.

오픈헬퍼를 선언하고 저장하는 것으로 openOrCreateDatabase를 대신한 코드입니다.

 

부스트코스에서 알려준 팁을 하나 말씀드리자면, 데이터베이스 오픈, 테이블 생성을 onCreate등에서 자동으로 처리되게 코드를 짜면 좀 더 효율적인 코드를 만들 수 있습니다.

INSERT SELECT는 매번 실행되는 기능이 아니니 사용자가 이벤트를 실행시켰을때 실행되도록 하면 되겠죠.

또 다른 팁은, 액티비티가 없어지면 데이터베이스 객체도 참조할 수 없으니, 서비스에서 데이터베이스를 다루게 하는 것입니다.

INSERT를 액티비티에서 서비스로 데이터를 보내고, 서비스에서 그것을 저장하도록 구성할 수 있습니다.

SELECT의 경우에도 서비스에서 조회한 데이터를 다시 액티비티로 보내서 화면에 표시할 수 있습니다.

 

 

그 외에도 인터넷 연결상태 확인 방법에 대해서 조금 더 이야기하겠습니다.

 

인터넷 연결상태를 확인할 땐 별도의 클래스를 정의해서 사용하면 편리합니다.

 

public class NetworkStatus {

    public static final int TYPE_WIFI = 1;
    public static final int TYPE_MOBILE = 2;
    public static final int TYPE_NOT_CONNECTED = 3;


    public static int getConnectivityStatus(Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo != null) {
            int type = networkInfo.getType();
            if(type == ConnectivityManager.TYPE_MOBILE) {
                return TYPE_MOBILE;
            } else if (type == ConnectivityManager.TYPE_WIFI) {
                return TYPE_WIFI;
            }
        }

        return TYPE_NOT_CONNECTED;
    }
}

인터넷 연결을 확인할 NetworkStatus클래스에 Context를 참조하는 getConnectivityStatus메소드와 상수를 선언해줍니다. Context를 참조하는 이유는 인터넷 연결 상태 확인을 위해 시스템 서비스를 사용해야 하는데, 시스템 서비스를 참조하려면 Context에서 getSystemService를 호출해야 하기 때문입니다.

말씀드린것처럼 getSystemService로 불러온 ConnectivityManager 변수에서 getActiveNetworkInfo를 호출해

연결 상태를 확인하는 것을 보실 수 있습니다.