Spinner / SQLite

2022. 10. 10. 15:53Dev.Program/Android

728x90

======== 0630_ch11_Gallery

  • drawable 폴더에 사진 10장 복사해넣기

 

< activity_main.xml >

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <Gallery

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/gallery"

       android:spacing="5dp"/>

 

   <ImageView

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:id="@+id/ivPoster"/>

 

</LinearLayout>

 

< MainActivity.java >

⇒ 생성자 만들 위치에 커서 두고 실행

  • 컨텍스트 적고
  • alt + insert 누르면 Constructor 나옴
  • 그럼 생성자 자동 생성됨

 

  • 자동완성하면 final 자동으로 붙음

 

package com.example.a0630_ch11_gallery;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.Gallery;

import android.widget.ImageView;

 

import java.nio.channels.GatheringByteChannel;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       Gallery gallery = findViewById(R.id.gallery);

 

       // Adapter 클래스 인스턴스 생성

       MyGalleryAdapter adapter = new MyGalleryAdapter(this);

 

       // Gallery 객체의 setAdapter() 메서드를 호출하여 Adapter 클래스의 인스턴스 전달

       gallery.setAdapter(adapter);

   }

 

   class MyGalleryAdapter extends BaseAdapter {

       Context context;

 

       // Gallery 에서 표시할 이미지의 ID 를 배열에 저장

       int[] posterId = {

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10,

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10,

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10

       };

 

       public MyGalleryAdapter(Context context) {

           this.context = context;

       }

 

       @Override

       public int getCount() {

           // getView() 메서드를 반복 호출할 횟수 리턴(=> 이미지 ID 갯수 리턴)

           return posterId.length;

       }

 

       @Override

       public View getView(final int position, View convertView, ViewGroup parent) {

           // 갤러리에서 표시할 이미지 1개에 대한 설정 => getCount() 만큼 반복하면서 여러 이미지 표시

           // ImageView 객체 생성(현재 컨텍스트 객체 전달)

           ImageView imageView = new ImageView(context);

           // ImageView 설정

           imageView.setLayoutParams(new Gallery.LayoutParams(200, 300));

           imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);

           imageView.setPadding(5, 5, 5, 5);

 

           // ImageView 에 표시할 이미지 지정

           imageView.setImageResource(posterId[position]);

 

           // ------------------------------------------------------------------------

           // Gallery 에 표시된 이미지 클릭 시 아래쪽 ImageView 에 큰 이미지 표시

           imageView.setOnClickListener(new View.OnClickListener() {

               @Override

               public void onClick(View v) {

                   // ImageView 위젯 ID 가져오기

                   ImageView ivPoster = findViewById(R.id.ivPoster);

                   // ImageView 위젯에 이미지 표시

                   ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);

                   ivPoster.setImageResource(posterId[position]);

               }

           });

           // ------------------------------------------------------------------------

 

           // ImageView 객체 리턴

           return imageView;

       }

 

       @Override

       public Object getItem(int position) {

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           return 0;

       }

   }

 

}

  • 클릭한 이미지 보임
  • 근데 클릭리스너로 구현하면 스크롤이 잘 안된다(흰부분 잡고 스크롤해야함)

⇒ 그래서 클릭리스너를 터치리스너로 바꿈

// OnTouchListener 사용 시

imageView.setOnTouchListener(new View.OnTouchListener() {

   @Override

   public boolean onTouch(View v, MotionEvent event) {

       // ImageView 위젯 ID 가져오기

       ImageView ivPoster = findViewById(R.id.ivPoster);

       // ImageView 위젯에 이미지 표시

       ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);

       ivPoster.setImageResource(posterId[pos]);

       return false;

   }

});

  • 이제 스크롤도 잘됨!



package com.example.a0630_ch11_gallery;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.Gallery;

import android.widget.ImageView;

import android.widget.Toast;

 

import java.nio.channels.GatheringByteChannel;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       Gallery gallery = findViewById(R.id.gallery);

 

       // Adapter 클래스 인스턴스 생성

       MyGalleryAdapter adapter = new MyGalleryAdapter(this);

 

       // Gallery 객체의 setAdapter() 메서드를 호출하여 Adapter 클래스의 인스턴스 전달

       gallery.setAdapter(adapter);

   }

 

   class MyGalleryAdapter extends BaseAdapter {

       Context context;

 

       // Gallery 에서 표시할 이미지의 ID 를 배열에 저장

       int[] posterId = {

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10,

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10

       };

 

       // 포스터 제목을 저장하는 배열 생성

       String[] posterTitle = {

               "써니", "완득이", "괴물", "라디오스타", "비열한거리", "왕의남자",

               "아일랜드", "웰컴투동막골", "헬보이", "백투더퓨쳐", "헬보이", "백투더퓨쳐",

               "헬보이", "백투더퓨쳐", "헬보이", "백투더퓨쳐", "헬보이", "백투더퓨쳐",

               "헬보이", "백투더퓨쳐"

       };

 

       public MyGalleryAdapter(Context context) {

           this.context = context;

       }

 

       @Override

       public int getCount() {

           // getView() 메서드를 반복 호출할 횟수 리턴(=> 이미지 ID 갯수 리턴)

           return posterId.length;

       }

 

       @Override

       public View getView(final int position, View convertView, ViewGroup parent) {

           // 갤러리에서 표시할 이미지 1개에 대한 설정 => getCount() 만큼 반복하면서 여러 이미지 표시

           // ImageView 객체 생성(현재 컨텍스트 객체 전달)

           ImageView imageView = new ImageView(context);

           // ImageView 설정

           imageView.setLayoutParams(new Gallery.LayoutParams(200, 300));

           imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);

           imageView.setPadding(5, 5, 5, 5);

 

           // ImageView 에 표시할 이미지 지정

           imageView.setImageResource(posterId[position]);

 

           // ------------------------------------------------------------------------

           // Gallery 에 표시된 이미지 클릭 시 아래쪽 ImageView 에 큰 이미지 표시

           // OnClickListener 사용 시 => 갤러리 이미지 스크롤이 부정확함

//            imageView.setOnClickListener(new View.OnClickListener() {

//                @Override

//                public void onClick(View v) {

//                    // ImageView 위젯 ID 가져오기

//                    ImageView ivPoster = findViewById(R.id.ivPoster);

//                    // ImageView 위젯에 이미지 표시

//                    ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);

//                    ivPoster.setImageResource(posterId[position]);

//                }

//            });

 

           // OnTouchListener 사용 시 => 갤러리 이미지 스크롤이 정확함(추천)

           imageView.setOnTouchListener(new View.OnTouchListener() {

               @Override

               public boolean onTouch(View v, MotionEvent event) {

                   // ImageView 위젯 ID 가져오기

                   ImageView ivPoster = findViewById(R.id.ivPoster);

                   // ImageView 위젯에 이미지 표시

                   ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);

                   ivPoster.setImageResource(posterId[position]);

 

                   // 포스터 제목 토스트로 출력하기

                   Toast.makeText(context, posterTitle[position], Toast.LENGTH_SHORT).show();

 

                   return false;

               }

           });

 

           // ------------------------------------------------------------------------

 

 

           // ImageView 객체 리턴

           return imageView;

       }

 

       @Override

       public Object getItem(int position) {

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           return 0;

       }

   }

 

}

  • 최종코드
  • (제목 토스트 찍힘)



======== 0630_ch11_ListView_custom

< activity_main.xml >

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   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="match_parent"

       android:id="@+id/listView"/>

 

</LinearLayout>

 

>>>>> listview_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

   xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="100dp"

   android:orientation="horizontal">

 

   <ImageView

       android:layout_width="0dp"

       android:layout_height="match_parent"

       android:layout_weight="1"

       android:src="@mipmap/ic_launcher"

       android:scaleType="fitCenter"

       android:layout_margin="10dp"/>

 

   <LinearLayout

       android:layout_width="0dp"

       android:layout_height="match_parent"

       android:layout_weight="5"

       android:orientation="vertical"

       android:layout_margin="10dp">

 

       <TextView

           android:layout_width="match_parent"

           android:layout_height="wrap_content"

           android:id="@+id/tvTitle"

           android:text="제목"

           android:textSize="30sp"/>

       <TextView

           android:layout_width="match_parent"

           android:layout_height="wrap_content"

           android:id="@+id/tvContent"

           android:text="내용입니다."

           android:textSize="20sp"/>

 

   </LinearLayout>

 

</LinearLayout>

 

< MainActivity.java >

package com.example.a0630_ch11_listview_custom;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.TextView;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       // ListView 위젯 ID 가져오기

       ListView listView = findViewById(R.id.listView);

 

       // BaseAdapter 클래스를 상속받는 Adapter 클래스 인스턴스 생성

       MyListViewAdapter adapter = new MyListViewAdapter(this);

 

       // ListView 객체의 setAdapter() 메서드를 호출하여 Adapter 객체 전달

       listView.setAdapter(adapter);

 

   }

 

   class MyListViewAdapter extends BaseAdapter {

       Context context;

 

       // 제목에 해당하는 문자열 배열 생성

       String[] title = {

               "제목1","제목2","제목3","제목4","제목5",

               "제목6","제목7","제목8","제목9","제목10"

       };

       String[] content = {

               "내용입니다1","내용입니다2","내용입니다3","내용입니다4","내용입니다5",

               "내용입니다6","내용입니다7","내용입니다8","내용입니다9","내용입니다10"

       };

 

       public MyListViewAdapter(Context context) {

           this.context = context;

       }

 

       @Override

       public int getCount() {

           return title.length;

       }

 

       @Override

       public View getView(int position, View convertView, ViewGroup parent) {

           // listview_layout.xml 파일을 연결하여 TextView 위젯에 텍스트 표시

           // View.inflate() 메서드를 사용하여 외부 XML 파일 사용

           View listViewLayout = View.inflate(context, R.layout.listview_layout, null);

 

           // 외부 XML 파일의 TextView 위젯 2개 가져오기

           TextView tvTitle = listViewLayout.findViewById(R.id.tvTitle);

           TextView tvContent = listViewLayout.findViewById(R.id.tvContent);

 

           // TextView 위젯에 배열 내의 문자열 출력

           tvTitle.setText(title[position]);

           tvContent.setText(content[position]);

 

           // 레이아웃이 저장된 View 객체 리턴

           return listViewLayout;

       }

 

       @Override

       public Object getItem(int position) {

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           return 0;

       }

   }

 

}

  • 목록 커스터마이징~

 

< Spinner >

======== 0630_ch11_Spinner

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <Spinner

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/spinner"/>

 

   <ImageView

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:id="@+id/ivPoster"/>

 

</LinearLayout>

 

< MainActivity.java >

package com.example.a0630_ch11_spinner;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.util.AndroidException;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       String[] posterTitle = {

               "써니", "완득이", "괴물", "라디오스타", "비열한거리", "왕의남자",

               "아일랜드", "웰컴투동막골", "헬보이", "백투더퓨쳐"

       };

 

       Spinner spinner = findViewById(R.id.spinner);

 

       // ArrayAdapter 객체를 사용하여 스피너에 영화 제목이 저장된 배열 전달

       // => 스피너 모양은 android.R.layout.simple_spinner_item 상수 사용

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_spinner_item, posterTitle);

 

       // Spinner 객체에 ArrayAdapter 객체 연결

       spinner.setAdapter(adapter);

 

   }

}



package com.example.a0630_ch11_spinner;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.util.AndroidException;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.Spinner;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       final String[] posterTitle = {

          "써니", "완득이", "괴물", "라디오스타", "비열한거리", "왕의남자",

          "아일랜드", "웰컴투동막골", "헬보이", "백투더퓨쳐"

       };

 

       final int[] posterId = {

          R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

          R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10

       };

 

       Spinner spinner = findViewById(R.id.spinner);

 

       // ArrayAdapter 객체를 사용하여 스피너에 영화 제목이 저장된 배열 전달

       // => 스피너 모양은 android.R.layout.simple_spinner_item 상수 사용

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_spinner_item, posterTitle);

 

       // Spinner 객체에 ArrayAdapter 객체 연결

       spinner.setAdapter(adapter);

 

       // Spinner 항목 선택 시 동작하는 이벤트 처리 => OnItemSelectedListener 사용

       spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

           @Override

           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

//                Toast.makeText(MainActivity.this, posterTitle[position] + " 선택됨", Toast.LENGTH_SHORT).show();

 

               // ImageView 위젯 ID 가져와서 선택된 항목에 대한 이미지 표시

               ImageView ivPoster = findViewById(R.id.ivPoster);

               ivPoster.setImageResource(posterId[position]);

           }

 

           @Override

           public void onNothingSelected(AdapterView<?> parent) {

 

           }

       });

 

   }

}

  • 선택된 항목 포스터가 ImageView 에 나타남

 

package com.example.a0630_ch11_spinner;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.util.AndroidException;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.Spinner;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       final String[] posterTitle = {

          "항목을 선택하세요", "써니", "완득이", "괴물", "라디오스타", "비열한거리", "왕의남자",

          "아일랜드", "웰컴투동막골", "헬보이", "백투더퓨쳐"

       };

 

       final int[] posterId = {

          0, R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

          R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10

       };

 

       Spinner spinner = findViewById(R.id.spinner);

 

       // ArrayAdapter 객체를 사용하여 스피너에 영화 제목이 저장된 배열 전달

       // => 스피너 모양은 android.R.layout.simple_spinner_item 상수 사용

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_spinner_item, posterTitle);

 

       // Spinner 객체에 ArrayAdapter 객체 연결

       spinner.setAdapter(adapter);

 

       // Spinner 항목 선택 시 동작하는 이벤트 처리 => OnItemSelectedListener 사용

       spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

           @Override

           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

//                Toast.makeText(MainActivity.this, posterTitle[position] + " 선택됨", Toast.LENGTH_SHORT).show();

 

               // ImageView 위젯 ID 가져와서 선택된 항목에 대한 이미지 표시

               // => 단, 영화제목이 아닌 선택 요청 항목일 경우 이미지 표시 X

               ImageView ivPoster = findViewById(R.id.ivPoster);

               ivPoster.setImageResource(posterId[position]);

 

//                if(position > 0) {

//                    ivPoster.setImageResource(posterId[position]);

//                } else {

               // ImageView 에 표시할 이미지를 0 으로 전달 시 이미지 제거됨

//                    ivPoster.setImageResource(0);

//                }

 

           }

 

           @Override

           public void onNothingSelected(AdapterView<?> parent) {

 

           }

       });

 

   }

}

  • 최종 코드

 

< Chapter 12 >

< SQLite >

======== 0630_ch12_SQLite_Basic

> 탐색기

  • C:\Users\ITWILL\AppData\Local\Android\Sdk\platform-tools 경로
  • 이 파일이 필요함

 

> cmd 창

C:\windows\system32>cd C:\Users\ITWILL\AppData\Local\Android\Sdk\platform-tools

C:\Users\ITWILL\AppData\Local\Android\Sdk\platform-tools>adb root

C:\Users\ITWILL\AppData\Local\Android\Sdk\platform-tools>adb shell

  • 안드 장치에 접속한 거!
  • 이제 프로젝트가 어디있는지 찾아야함
  • 안드로이드스튜디오 오른쪽 밑 클릭
  • 이렇게 만들어도 되지만 cmd 에서 만들어보자

generic_x86:/ # cd /data/data

generic_x86:/data/data # cd com     +Tab키 계속 누르면 파일들 주르르 나옴

generic_x86:/data/data # cd com.example.a0630_ch12_sqlite_basic

generic_x86:/data/data/com.example.a0630_ch12_sqlite_basic # mkdir databases

  • 데이터 베이스 만들기

generic_x86:/data/data/com.example.a0630_ch12_sqlite_basic # ls

  • 목록보기

cache code_cache databases

 

  • 생김!(연동이 되어있다는 거!)

 

generic_x86:/data/data/com.example.a0630_ch12_sqlite_basic # cd databases/

  • 디비 파일이 여기 만들어질 거기 때문에

generic_x86:/data/data/com.example.a0630_ch12_sqlite_basic/databases # sqlite3 testDB

SQLite version 3.22.0 2018-12-19 01:30:22

Enter ".help" for usage hints.

sqlite>

  • SQLite 프롬프트로 바뀜
  • mysql -u root -p 접속이랑 똑같은거~~
  • 여기서 이제 INSERT DELETE 등등 할 수 있다

 

p.14

 

sqlite> .table

sqlite> CREATE TABLE test (idx INT,name VARCHAR(10));

sqlite> .table

test

sqlite> .schema

CREATE TABLE test (idx INT,name VARCHAR(10));

sqlite> INSERT INTO test VALUES(1, 'hong');

sqlite> INSERT INTO test VALUES(2, 'lee');

sqlite> SELECT * FROM test;

1|hong

2|lee

sqlite> .header on          ⇒ 컬럼명 보여줌

sqlite> SELECT * FROM test;

idx|name

1|hong

2|lee

sqlite> .mode column          ⇒ 위치 정렬해줌

sqlite> SELECT * FROM test;

idx              name

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

1                 hong

2                 lee

sqlite>

  • 안드에도 보임!
  • 장치에서 PC 로
  • PC 에서 장치로
  • 가지고 다닐 수 있다!

 

  • 공유파일 가져오기
  • 실행시키기
  • 나머지는 다 그대로 Next - Install
  • 설치 완료(실행해보기 - 새버전X)

 

  • 이건 PC 에 설치했기 때문에 저장하면 PC 에 저장됨!
  • 이걸 그냥 사용하려면 안드로이드 스튜디오에서 Save As 한 파일을 가져와서 작업하고 다시 Upload 하는 과정이 필요함

 

< activity_main.xml >

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <TextView

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1"

       android:id="@+id/tv"/>

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnSelect"

       android:text="조회하기"

       android:textSize="20sp"/>

 

</LinearLayout>

 

>>>> 데이터 베이스에 접근하려면 이론이 좀 필요(p19)

  • 읽기 전용은 Select 읽고쓰기용은 나머지구문들

 

< MainActivity.java >

  • 마우스 얹어서 Create~ 누르기
  • 아까 만든거 일단 지우기

// SQLite 를 사용하기 위해 SQLiteOpenHelper 클래스를 상속받는 서브클래스 정의

class MyDBHelper extends SQLiteOpenHelper {

 

   public MyDBHelper(@Nullable Context context) {

       super(context, "testDB", null, 1);

   }

 

   @Override

   public void onCreate(SQLiteDatabase db) {

 

   }

 

   @Override

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

 

   }

}

  • 서브클래스 정의하기

 

< activity_main.xml >

<Button

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

   android:id="@+id/btnInsert"

   android:text="추가하기"

   android:textSize="20sp"/>

  • 버튼 하나 더 추가

 

< MainActivity.java >

  • 리턴타입 확인하기

package com.example.a0630_ch12_sqlite_basic;

 

import androidx.annotation.Nullable;

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   MyDBHelper myDBHelper;

   TextView tv;

   Button btnInsert, btnSelect;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       // SQLiteOpenHelper 클래스를 상속받아 정의한 DBHelper 클래스 인스턴스 생성 => 컨텍스트 전달

       myDBHelper = new MyDBHelper(this);

 

       tv = findViewById(R.id.tv);

       btnInsert = findViewById(R.id.btnInsert);

       btnSelect = findViewById(R.id.btnSelect);

 

       btnInsert.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               // 데이터를 DB 에 추가

               int idx = 1;

               String name = "hong";

 

               // MyDBHelper 객체를 사용하여 쓰기 가능 형태로 DB 연결

               // => DB 연결 시 SQLiteDatabase 객체 리턴됨

               SQLiteDatabase sqlDb = myDBHelper.getWritableDatabase();

 

               // SQLiteDatabase 객체를 사용하여 INSERT 구문 실행 => execSQL() 메서드 사용

               String sql = "INSERT INTO test VALUES(" + idx + ",'" + name + "')";

               sqlDb.execSQL(sql);

              

               // DB 자원 반환

               sqlDb.close();

               Toast.makeText(MainActivity.this, "입력완료", Toast.LENGTH_SHORT).show();

           }

       });

 

       btnSelect.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

 

           }

       });

 

   }

 

   // SQLite 를 사용하기 위해 SQLiteOpenHelper 클래스를 상속받는 서브클래스 정의

   class MyDBHelper extends SQLiteOpenHelper {

 

       // SQLiteOpenHelper 클래스를 상속받은 뒤, onCreate(), onUpgrade() 추상메서드 구현

       // 생성자 정의 => 파라미터 : Context 객체,

       //                          슈퍼클래스 생성자 호출하여 Context 객체, DB명, null, 버전번호 전달

       public MyDBHelper(@Nullable Context context) {

           // 슈퍼클래스 생성자를 통해 지정한 이름의 DB 생성

           // => 기존에 동일한 DB 가 존재하면 해당 DB 를 그대로 사용

           super(context, "testDB", null, 1);

       }

 

       @Override

       public void onCreate(SQLiteDatabase db) {

           // 새로운 테이블을 생성하는 작업을 담당(기존 테이블 존재 시 그대로 사용)

           // SQLiteDatabase 객체의 execSQL() 메서드를 호출하여 DB 내의 테이블 생성

           String sql = "CREATE TABLE test(idx INT, name VARCHAR(10))";

           db.execSQL(sql);

       }

 

       @Override

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

           // 기존 테이블을 제거하고 새로 만들기 위해 onCreate() 메서드를 호출을 담당

           // SQLiteDatabase 객체의 execSQL() 메서드를 호출하여 DB 내의 테이블 삭제

           String sql = "DROP TABLE test";

           db.execSQL(sql);

           // onCreate() 메서드를 호출하여 새 테이블 생성

           onCreate(db);

       }

   }

 

}

  • 디바이스에 추가하기 버튼 눌렀을 때 토스트 뜨는지 확인
  • 여기도 추가되어있다

 

> cmd 창에서

generic_x86:/data/data/com.example.a0630_ch12_sqlite_basic/databases # sqlite3 testDB

SQLite version 3.22.0 2018-12-19 01:30:22

Enter ".help" for usage hints.

sqlite> .table

android_metadata  test

sqlite> .schema

CREATE TABLE android_metadata (locale TEXT);

CREATE TABLE test(idx INT, name VARCHAR(10));



>> 이제 조회하기

btnSelect.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

       // MyDBHelper 객체를 사용하여 읽기 전용 형태로 DB 연결

       // => DB 연결 시 SQLiteDatabase 객체 리턴됨

       SQLiteDatabase sqlDb = myDBHelper.getReadableDatabase();

 

       // SQLiteDatabase 객체의 query() 또는 rawQuery() 메서드를 사용하여 SELECT 문 실행

       // => 조회 결과가 Cursor 타입 객체로 리턴됨(JDBC ResultSet과 유사)

       String sql = "SELECT * FROM test";

       Cursor cursor = sqlDb.rawQuery(sql, null);

 

       // while 문을 사용하여 Cursor 객체의 moveToNext() 메서드가 true 일 동안 반복

       // => ResultSet 객체의 next() 메서드와 동일

       while (cursor.moveToNext()) {

           // Cursor 객체의 getXXX() 메서드를 호출하여 컬럼데이터 가져오기

           // => XXX 은 가져올 데이터의 자바 데이터타입, 파라미터로 컬럼인덱스 전달

           int idx = cursor.getInt(0);

           String name = cursor.getString(1);

 

           tv.setText(tv.getText() + "\n" + idx + "\t" + name);

           tv.setTextSize(30);

       }

 

       // DB 자원 반환

       cursor.close();

       sqlDb.close();

 

   }

});

  • 조회하기 누르면 이런 화면 나옴

 

  • 저장하기

아까 다운받았던 DB Browser 열기

  • 데이터베이스 열기

 

  • 데이터 추가도 가능
  • 변경사항 저장하기!

 

> 안드로이드 스튜디오로 돌아가서

  • testDB 넣어보기
  • 그리구 폰화면에서 조회하기 버튼 클릭하기



< activity_main.xml >

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <EditText

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1"

       android:id="@+id/etIdx"

       android:hint="번호 입력"/>

 

   <EditText

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1"

       android:id="@+id/etName"

       android:hint="이름 입력"/>

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnInsert"

       android:text="추가하기"

       android:textSize="20sp"/>

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnSelect"

       android:text="조회하기"

       android:textSize="20sp"/>

 

   <TextView

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1"

       android:id="@+id/tv"

       android:background="#00FF88"/>

 

</LinearLayout>

 

< MainActivity.java >

package com.example.a0630_ch12_sqlite_basic;

 

import androidx.annotation.Nullable;

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   MyDBHelper myDBHelper;

   TextView tv;

   Button btnInsert, btnSelect;

   EditText etIdx, etName;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       // SQLiteOpenHelper 클래스를 상속받아 정의한 DBHelper 클래스 인스턴스 생성 => 컨텍스트 전달

       myDBHelper = new MyDBHelper(this);

 

       tv = findViewById(R.id.tv);

 

       etIdx = findViewById(R.id.etIdx);

       etName = findViewById(R.id.etName);

 

       btnInsert = findViewById(R.id.btnInsert);

       btnSelect = findViewById(R.id.btnSelect);

 

       btnInsert.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               // 데이터를 DB 에 추가

               // EditText 위젯에 입력된 항목 가져와서 변수에 저장

//                int idx = 2;

//                String name = "lee";

               if(etIdx.length() == 0) {

                   Toast.makeText(MainActivity.this, "번호 입력 필수!", Toast.LENGTH_SHORT).show();

                   etIdx.requestFocus();

                   return;

               } else if(etName.length() == 0) {

                   Toast.makeText(MainActivity.this, "이름 입력 필수!", Toast.LENGTH_SHORT).show();

                   etName.requestFocus();

                   return;

               }

 

               int idx = Integer.parseInt(etIdx.getText().toString());

               String name = etName.getText().toString();

 

               // MyDBHelper 객체를 사용하여 쓰기 가능 형태로 DB 연결

               // => DB 연결 시 SQLiteDatabase 객체 리턴됨

               SQLiteDatabase sqlDb = myDBHelper.getWritableDatabase();

 

               // SQLiteDatabase 객체를 사용하여 INSERT 구문 실행 => execSQL() 메서드 사용

               String sql = "INSERT INTO test VALUES(" + idx + ",'" + name + "')";

               sqlDb.execSQL(sql);

              

               // DB 자원 반환

               sqlDb.close();

               Toast.makeText(MainActivity.this, "입력완료", Toast.LENGTH_SHORT).show();

           }

       });

 

       btnSelect.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               // MyDBHelper 객체를 사용하여 읽기 전용 형태로 DB 연결

               // => DB 연결 시 SQLiteDatabase 객체 리턴됨

               SQLiteDatabase sqlDb = myDBHelper.getReadableDatabase();

 

               // SQLiteDatabase 객체의 query() 또는 rawQuery() 메서드를 사용하여 SELECT 문 실행

               // => 조회 결과가 Cursor 타입 객체로 리턴됨(JDBC ResultSet과 유사)

               String sql = "SELECT * FROM test";

               Cursor cursor = sqlDb.rawQuery(sql, null);

 

               // while 문을 사용하여 Cursor 객체의 moveToNext() 메서드가 true 일 동안 반복

               // => ResultSet 객체의 next() 메서드와 동일

               while (cursor.moveToNext()) {

                   // Cursor 객체의 getXXX() 메서드를 호출하여 컬럼데이터 가져오기

                   // => XXX 은 가져올 데이터의 자바 데이터타입, 파라미터로 컬럼인덱스 전달

                   int idx = cursor.getInt(0);

                   String name = cursor.getString(1);

 

                   tv.setText(tv.getText() + "\n" + idx + "\t" + name);

                   tv.setTextSize(30);

               }

 

               // DB 자원 반환

               cursor.close();

               sqlDb.close();

 

           }

       });

 

   }

 

   // SQLite 를 사용하기 위해 SQLiteOpenHelper 클래스를 상속받는 서브클래스 정의

   class MyDBHelper extends SQLiteOpenHelper {

 

       // SQLiteOpenHelper 클래스를 상속받은 뒤, onCreate(), onUpgrade() 추상메서드 구현

       // 생성자 정의 => 파라미터 : Context 객체,

       //                          슈퍼클래스 생성자 호출하여 Context 객체, DB명, null, 버전번호 전달

       public MyDBHelper(@Nullable Context context) {

           // 슈퍼클래스 생성자를 통해 지정한 이름의 DB 생성

           // => 기존에 동일한 DB 가 존재하면 해당 DB 를 그대로 사용

           super(context, "testDB", null, 1);

       }

 

       @Override

       public void onCreate(SQLiteDatabase db) {

           // 새로운 테이블을 생성하는 작업을 담당(기존 테이블 존재 시 그대로 사용)

           // SQLiteDatabase 객체의 execSQL() 메서드를 호출하여 DB 내의 테이블 생성

           String sql = "CREATE TABLE test(idx INT, name VARCHAR(10))";

           db.execSQL(sql);

       }

 

       @Override

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

           // 기존 테이블을 제거하고 새로 만들기 위해 onCreate() 메서드를 호출을 담당

           // SQLiteDatabase 객체의 execSQL() 메서드를 호출하여 DB 내의 테이블 삭제

           String sql = "DROP TABLE test";

           db.execSQL(sql);

           // onCreate() 메서드를 호출하여 새 테이블 생성

           onCreate(db);

       }

   }

 

}




728x90

'Dev.Program > Android' 카테고리의 다른 글

구글지도 설정  (0) 2022.10.10
로그인  (0) 2022.10.10
logcat / ListView  (0) 2022.10.10
여러 Activity  (0) 2022.10.10
Fragment / 메뉴와 대화상자 / Context_Menu / Toast  (0) 2022.10.10