ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 간단한 Android Sqlite 예제 ( DB생성,테이블 생성, 데이터 입력, 테이터 보여주기)
    Android/SQLite 2019. 2. 12. 14:18


    간단한 SQLite를 사용하는 예제 입니다.

    앱을 시작하면 데이터 베이스를 생성하고  names, phones 두개의 컬럼이 있는 테이블을 생성하고 데이터를 삽입합니다.

    그리고 나서 테이블에서 데이터를 가져와 리스트뷰에 보여주는 예제입니다..





    activity_main.xml파일입니다. 리스트뷰를 화면에 보여줍니다.


    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context=".MainActivity">

       <ListView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:id="@+id/listView" />


    </LinearLayout>




    list_item.xml은 listview 한줄에 여러 개의 항목을 보여주기 위해 필요한 레이아웃입니다.


    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:padding="10dp"
       android:paddingLeft="10dp"
       android:paddingRight="10dp" >

       <TextView
           android:id="@+id/name"
           android:layout_width="0dp"
           android:layout_weight="0.5"
           android:layout_height="wrap_content"
           android:textStyle="bold"/>


       <TextView
           android:id="@+id/phone"
           android:layout_width="0dp"
           android:layout_weight="0.5"
           android:layout_height="wrap_content"
           android:textStyle="bold" />

    </LinearLayout>




    MainActivity.java는 자바 프로그램 코드 입니다.


    package com.tistory.webnautes.sqllite_example;


    import android.app.Activity;
    import android.os.Bundle;

    import java.util.ArrayList;
    import java.util.HashMap;

    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.util.Log;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;




    public class MainActivity  extends Activity {


       private final String dbName = "webnautes";
       private final String tableName = "person";

       private String names[];
       {
           names = new String[]{"Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "Kitkat"};
       }

       private final String phones[];
       {
           phones = new String[]{"Android 1.5", "Android 1.6", "Android 2.0", "Android 2.2", "Android 2.3", "Android  3.0", "Android  4.0", "Android  4.1", "Android  4.4"};
       }


       ArrayList<HashMap<String, String>> personList;
       ListView list;
       private static final String TAG_NAME = "name";
       private static final String TAG_PHONE ="phone";

       SQLiteDatabase sampleDB = null;
       ListAdapter adapter;


       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           list = (ListView) findViewById(R.id.listView);
           personList = new ArrayList<HashMap<String,String>>();


           try {


               sampleDB = this.openOrCreateDatabase(dbName, MODE_PRIVATE, null);

               //테이블이 존재하지 않으면 새로 생성합니다.
               sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName
                       + " (name VARCHAR(20), phone VARCHAR(20) );");

               //테이블이 존재하는 경우 기존 데이터를 지우기 위해서 사용합니다.
               sampleDB.execSQL("DELETE FROM " + tableName  );

               //새로운 데이터를 테이블에 집어넣습니다..
               for (int i=0; i<names.length; i++ ) {
                   sampleDB.execSQL("INSERT INTO " + tableName
                           + " (name, phone)  Values ('" + names[i] + "', '" + phones[i]+"');");
               }

               sampleDB.close();

           } catch (SQLiteException se) {
               Toast.makeText(getApplicationContext(),  se.getMessage(), Toast.LENGTH_LONG).show();
               Log.e("", se.getMessage());


           }

           showList();

       }




       protected void showList(){

           try {

               SQLiteDatabase ReadDB = this.openOrCreateDatabase(dbName, MODE_PRIVATE, null);


               //SELECT문을 사용하여 테이블에 있는 데이터를 가져옵니다..
               Cursor c = ReadDB.rawQuery("SELECT * FROM " + tableName, null);

               if (c != null) {


                   if (c.moveToFirst()) {
                       do {

                           //테이블에서 두개의 컬럼값을 가져와서
                           String Name = c.getString(c.getColumnIndex("name"));
                           String Phone = c.getString(c.getColumnIndex("phone"));

                           //HashMap에 넣습니다.
                           HashMap<String,String> persons = new HashMap<String,String>();

                           persons.put(TAG_NAME,Name);
                           persons.put(TAG_PHONE,Phone);

                           //ArrayList에 추가합니다..
                           personList.add(persons);

                       } while (c.moveToNext());
                   }
               }

               ReadDB.close();


               //새로운 apapter를 생성하여 데이터를 넣은 후..
               adapter = new SimpleAdapter(
                       this, personList, R.layout.list_item,
                       new String[]{TAG_NAME,TAG_PHONE},
                       new int[]{ R.id.name, R.id.phone}
               );


               //화면에 보여주기 위해 Listview에 연결합니다.
               list.setAdapter(adapter);


           } catch (SQLiteException se) {
               Toast.makeText(getApplicationContext(),  se.getMessage(), Toast.LENGTH_LONG).show();
               Log.e("",  se.getMessage());
           }

       }


    }




    업데이트  

    2015. 11. 22

    2019.  2. 12





    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    TAG

    댓글 20

    • so 2019.02.12 12:24


      mainactivity.java에서
      adapter = new SimpleAdapter(
      this, personList, R.layout.list_item,
      new String[]{TAG_NAME,TAG_PHONE},
      new int[]{ R.id.name, R.id.phone}
      에서 R이 빨간색으로 오류가 뜨고


      private final String[] name = new String[]{"cupcake", "Donut", "Eclair", "Froyo",
      "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "Kitkat"};
      에서 "cupcake","Donut"....등 " .." 안의 항목이 다 빨간줄로 오류나는 데 이유가뭘까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.12 14:21 신고


        포스팅을 업데이트 했습니다. 다시 해보세요.

        R오류 뜨는 것은 프로젝트가 잘못 생성되서 그럴 수 있습니다.

      • so 2019.02.12 15:33


        업데이트까지ㅜㅠㅠㅠ정말감사합니다ㅠㅠㅠㅠㅠㅠ sqlite위의예제처럼 사용해서 table 열항목을 두개 추가해 4개의 항목을 만든다음, 검색창기능으로 리스트의이름을 검색해서 나온 해당 항목을 클릭하면 새페이지로 넘어가 해당항목의 모든 table 내용이 화면에 뜨게하는 기능이 구현가능 할까요??... 복잡한 질문읽어주셔서감사합니다ㅠㅠ

      • so 2019.02.12 15:41


        죄송합니다..한가지만 더여쭤볼게요..
        datebase 와 table 파일의 위치는 어디에 있을까요??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.12 16:57 신고


        가능합니다. sql 파일 위치는 다음 링크를 참고하세요

        https://stackoverflow.com/questions/4452538/location-of-sqlite-database-on-the-device

      • so 2019.02.14 14:57


        정말너무너무감사합니다ㅜㅜㅜㅜ 정말유용해요 혹시위 코드를 이용하여 리스트 항목 눌러서넘어간 새 페이지에서 테이블의 각 행의 항목들 정보를 가져오려면 cursor를 써야할까요??ㅜㅜ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.14 16:59 신고


        인텐트(intent)를 사용하여 데이터를 전달해도 되지 않을까 싶습니다.

    • jy 2019.03.18 15:02


      버튼 클릭시 리스트 뷰로 데이터를 보여주고 싶어 위 코드를 참고하여 만들었습니다.
      그런데 클릭스 테이블을 찾을 수 없다는 문구가 뜹니다ㅜㅜ 테이블은 만들어진것 같은데 왜그런 건지 모르겠습니다

    • hello 2019.05.09 13:12


      그 궁금한게 있는데 이 코드를 이용해서 다른 테이블에 적용하고 싶어서 phone이라는 변수 이름을 다른 변수 이름으로 수정하였는데 그 튜플값을 찾을 수 없다고 하는데 어케 해야 다른 변수를 사용할 수 있나요? mainactivity코드와 list_item 코드를 수정하였는데 작동을 안해서요 ㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 13:16 신고


        에러메시지를 올려주세요

      • hello 2019.05.09 18:26


        build시에 에러는 발생하지 않지만 앱을 실행하면

        table address has no column named address(code 1);. while compling INSERT INTO rehobot(name,addres) values('rehobot', '경기도 용인시');

        table명을 rehobot으로 바꾸고 안의 데이타들을 좀 바꾸었지만 phone을 그대로 적용하면 앱이 정상적으로 작동하는데 address로 phone의 변수를 다르게 적용하니 앱이 실행이 안됩니다 ㅠㅠ


      • hello 2019.05.09 18:28


        build시엔 에러가 없으며 mainactivity에서의 phone부분을 모두 address로 수정하였고 list_item.xml파일에서 phone부분도 address로 다 수정하였습니다 그런데 변수만 바꾸었는데 왜 적용이 안되는지 궁금합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 18:43 신고


        테이블의 컬럼하고 sql문에서 사용한 컬럼이름이 달라서 생긴문제로 보이네요..

      • hello 2019.05.09 18:46


        아 그러면 혹시 컬럼의 변수를 설정 혹은 더 추가 하려면activity_main과 list_item xml파일 수정 외에 또 다른 작업이 필요한 건가요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 18:48 신고


        sql에서 테이블 컬럼도 바꿔야합니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 19:54 신고


        다음 세군데에 있는 name과 phone을 똑같이 다른 문자열로 바꾸어주면 동작합니다.


        테이블 생성하는 부분

        sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName
        + " (name VARCHAR(20), phone VARCHAR(20) );");



        테이블에 데이터 넣는 부분

        for (int i=0; i<names.length; i++ ) {
        sampleDB.execSQL("INSERT INTO " + tableName
        + " (name, phone) Values ('" + names[i] + "', '" + phones[i]+"');");
        }




        질의 결과에서 컬럼값 가져오는 부분

        String Name = c.getString(c.getColumnIndex("name"));
        String Phone = c.getString(c.getColumnIndex("phone"));

    • do 2019.07.07 05:33


      안녕하세요 항상 좋은 자료들 찾아보고있습니다.
      질문이 있는데요
      DB SELECT에서 조건으로 Cursor c = ReadDB.rawQuery("SELECT * FROM method where name = ?", new String[]{"%" + strSearch + "%"});
      이러하게 부분적으로 조건을 검색하려고 하는데 구문오류라고 그러는데 이유를 알 수 있을까요? (결과가 null 값이기도 합니다.)
      strSearch는 검색하는 EditText에서 가져온 문자열 입니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.07 08:28 신고


        문자열을 조합한 결과를 따로 변수에 넣어서 제대로 조합되었는지 로그캣에 출력해본 후

        rawQuery 함수에 대입하여 해보세요.

    • Favicon of https://chicken-investment.tistory.com BlogIcon 트리케라 2019.11.19 23:55 신고


      정말 도움이 된 게시물 이었습니다. 그런데 데이터베이스를 수정한 다음 리스트를 새로고침할 수 있는 방법이 있을까요?
      데이터베이스 수정까지는 성공했는데, 검색하면 notifyDataSetChanged를 사용하라고 되어있는데 계속 빨간줄이 떠서 문의드립니다.

Designed by Tistory.