안드로이드/DataBase

AssetOpenHelper Library 사용

-----------------------------------------------------

1. 엑셀파일을 CSV -> *.db로 볂환하는 과정

라이브러리와 무관하게 Excel(excel 첫번째 칼럼 _id 로 시작해서 db작성)-> 

csv로 저장->

저장한 csv를 텍스트문서로 열어서 UTP-8로 코딩->  

파이어폭스의 sqlitemanager로 db생성 ->

생성된 db에서 csv를 import , 첫row포함시키고 _id에서는 1,2,4번째 체크박스를 yes로 준다. -->

*.sqlite로 저장됨 , 임의로 f2키로 확장자 *.db로 만들어줌.


cf) *한글깨짐 참고사이트 : http://blog.naver.com/PostView.nhn?blogId=rlaqt&logNo=10092559173


2. app->new->folder->assets 만들기-> assets내에서는 directory로서 databases 만들기  -> 그안에 1번에서 생성한 *.db 넣어주기


3. 자바패키지명에서 우클릭>new>pakage를 생성해서 Activity / Model / Util 순으로 그룹화해주기

--my) 엑셀>csv명>import되는 table명이다. table명은,, MyDatabaseClass 에서 쿼리문에서 쓰인다.

파폭의 생성db명은 MySQLiteHelper에서 assets폴더에서 불러낼 db명이다.


4. 데이터를 불러올 액티비티의 자바에서 전역변수로서, 데이터를 담아둘 클래스(Model패키지폴더에 있는)인 <MuscleClass>형으로 List를 선언해준다.


public class MainActivity extends AppCompatActivity {

    List<MuscleClass> muscleClassList;


5. onCreate()에서는 이 MuscleClass형의 List변수인 muscleClassList에다가   (Model 패키지폴더에 있는) MyDataBaseClass.를 이용해서 모든 데이터를 다 받아오도록 대입해준다.

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        muscleClassList = MyDatabaseClass.getInstance(getApplicationContext()).getAllMuscleData();


6. Model 자바패키지폴더내의  [ MuscleClass.java ]에는 db칼럼에 따른 받아올 변수 10개를 선언하고, 그에따른 겟 셋터들을 만들어준다. 

<이미 만들어져있으니 복붙> 

여기에 선언된 변수 10개를 담고있는 MuscleClass라는 자료형의  리스트를 만들어서 모든 db의 각 row정보들을 이 리스트에 담는다.


 *수정할 부분이 있으면 1.  변수 추가/삭제한 뒤 --> getter and setter 추가 / 삭제

   대신.. 정보가 하나 더들어오면,, 엑셀->csv시에도 칼럼을 늘린다. 칼럼명도 기억해야한다. 밑에서 쓰임.


7. Model 자바패키지폴더내의 [ MyDatabaseClass.java]에는  액티비티 자바파일에서,  db의 모든정보를 빼내서 -> muscleClassList라는 리스트에다가 하나씩 꼽아줄 getAllMuscleData();라는 매쏘드가 정의되어있다.

 (1) 커서를 돌리면서 각 row의 db속에 있는 "칼럼명"을 조회하고  해당row에 모든 정보들을    set변수10개를 이용해서 ->muscleClass형 변수에다가 집어넣어준다. 각 row 칼럼정보 10개를 다 받은 muscleClass변수를 이용해서 muscleClass형의 list변수에다가 add해준다.  다 들어간 muscleList를 return 해준다.


 * 수정할부분이 있으면   1. 엑셀에서 칼럼추가, csv새로저장, db새로생성 ->

2. MuscleClass에서 변수추가, getter and setter 추가  -> 

3. MyDatabaseClass 에서 db칼럼마다 뽑아오는 것에 추가.



8.  이제 gradle에 AssetOpenHelper라는 라이브러리를 추가해준다.

    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'


9. 라이브러리를 이용한 클래스는 Model 자파패키지폴더내의 [MySQLiteHelper.java]라는 클래스다.

(1) extends SQLiteAssetHelper를 상속하고 있으며

(2) 전역변수로서 2개의 상수가 있는데 각각이  [ assets 폴더내의 db이름 ]   과 버전을 표시한다.

    private static final String DATABASE_NAME = "new.db";

    private static final int DATABASE_VERSION = 1;


(3) 이 클래스형의 변수가 [ MyDatabaseClass] 내에서 myhelper로서 openDB(); 와 closeDB();가 가능하도록한다


 * 수정할 부분이 있으면 1. 상수선언시 asset폴더내의 db이름을 지정해준다.

2. 상수선언시 db버젼을 표시해준다.


10. 이제 액티비티 onCreate()에서 꺼내쓰기만 하면된다. 4,5번과정에서.. 이미 db정보를 -> muscleClassList에 하나씩 다 쌓아뒀다.

      muscleClassList라는 변수를 이용해서 해당 row를 꺼내온다음. setText해주면된다. 


        tv = (TextView) findViewById(R.id.tv);

        tv.setText(muscleClassList.get(4).getmNumber() + "번째 근육입니다.\n"

                    +muscleClassList.get(4).getmKorea()+"가 근육이름입니다.\n"

                    +muscleClassList.get(4).getmEng()+"가 영어이름입니다.\n"

                    +muscleClassList.get(4).getmOrigin()+"가 오리진입니다.\n"

                    +muscleClassList.get(4).getmInsert()+"가 인서션입니다.\n"

                    +muscleClassList.get(4).getmExplain()+"가 설명입니다.\n"

                    +muscleClassList.get(4).getmImage()+ " 그림 파일 이름 입니다.\n"

                    +muscleClassList.get(4).getmFavorite()+"가 즐찾 상태입니다.\n"


                +muscleClassList.get(4).getmApply()+"가 응용입니다.\n"


        );



11. 응용으로서 전체데이터조회가 아닌,    액티비티의 public static으로 선언한 String mNumber 값을 가지고 해당 근육번호 #1,2,3,4 에 대한 것만 조회가능 한 [MyDatabaseClass.java]에 getMuscleData()매쏘드를 만들었다.

(1) db정보를 불러올 Activity에  public static String mNumber; 를 전역변수로 선언한다(static이라 db클래스에서도 조회되도록)

(2) MyDatabaseClass 에다가 매쏘드를 정의해준다. 전체 리스트를 조회하는 것 대신 return타입을 MuscleClass로 해주고, 쿼리문에 where를 달아주어, 액티비티의 전역변수 mNumber를 이용하도록 했다.

(3) 전체데이터에서 get(i)번째가 아니라. 조회된 데이터에서 바로 set 시키로도록 수정했다.


    public  MuscleClass getMuscleData(){




        openDB();


        MuscleClass muscle = new MuscleClass();

        String sql = "SELECT * FROM muscle where mNumber = '"+ mNumber+"'";

        Cursor cr = database.rawQuery(sql, null);

        if(cr.moveToFirst()) {


            muscle.setmNumber(cr.getString(cr.getColumnIndex("mNumber")));

            muscle.setmKorea(cr.getString(cr.getColumnIndex("mKorea")));

            muscle.setmEng(cr.getString(cr.getColumnIndex("mEng")));

            muscle.setmOrigin(cr.getString(cr.getColumnIndex("mOrigin")));

            muscle.setmInsert(cr.getString(cr.getColumnIndex("mInsert")));

            muscle.setmExplain(cr.getString(cr.getColumnIndex("mExplain")));



            muscle.setImageNumber(cr.getInt(cr.getColumnIndex("ImageNumber")));

            muscle.setmImage(cr.getString(cr.getColumnIndex("mImage")));

            muscle.setmFavorite(cr.getInt(cr.getColumnIndex("mFavorite")));


            muscle.setmApply(cr.getString(cr.getColumnIndex("mApply")));

        }

        else {

        }



        CloseDB();


        return muscle;

    }



cf) 라이브러리를 써야지만 openDB(); closeDB();가 가능한 것.



12.기존 완성안된 muscle.db를 복붙해주더라도 단말기내에 설치된 기존의 이름으로 하면 계속 에러가 나거나 제대로 안된다.  MySQLiteHelper.java에서 버젼을 올리면 액티비티가 에러가난다..  db이름을 바꿔서 muscle2.db로 주고 MySQLiteHelper.java에서 새로운 db이름 지정해줬다. 수정 필요.



-->     단말기속에서 이미 기존버젼으로 설치가 되어있을 때,  업그레이드 할려면 MySQLiteHelper.java속에서 

(1)     public MySQLiteHelper(Context context) {} 안에다가

(2)    setForcedUpgrade();를 넣어줘야한다. 기존에는 없었따..


    public MySQLiteHelper(Context context) {

        super(context, DATABASE_NAME, null, DATABASE_VERSION);


        setForcedUpgrade();


}


****담부터 파일백업복사시.. 앱명 바꾸기 ->  db이름과 dbversion을 1로 초기화 해놓기

****만약  db가 추가된다면,, 엑셀에서 고치고-> db만들고-> 앱명 안바꾸는 이상 db복붙하더라두 version한칸 올려야한다.

1. 라이브러리와 무관하게 Excel(excel 첫번째 칼럼 _id 로 시작해서 db작성) ->

2. csv로 저장 ->

3. 저장한 csv를 텍스트문서로 열어서 UTP-8로 코딩 ->

4. 파폭의 sqlitemanager로 임의의 db생성 ->

5. 생성된 db에서 csv를 import , 첫row 포함(체크)시키고 

   _id에서는 1,2,4번째 체크박스를 yes로 준다. --> *.sqlite로 저장됨 , 

6. 임의로 f2키로 확장자 *.db로 만들어줌 ->

  *한글깨짐 참고사이트 : http://blog.naver.com/PostView.nhn? blogId=rlaqt&logNo=10092559173


7. app->new->folder->assets 만들기-> 

assets내에서는 directory로서 databases 만들기 ->  

그안에 4번에서 생성한 *.db 넣어주기

+ Recent posts