1. Window - Android Virtual Device Manager 클릭


2. CREATE A NEW AVD 클릭


-넥서스S


-API TARGET


-NOSKIN 선택


3. OK


JAVA

참고 : http://villa4u.co.kr/jbn/bbs/board.php?bo_table=javap2&wr_id=22



C#

참고 : http://www.hoons.net/Board/qacshap/Content/30343

안드로이드는 NinePatch 그래픽이라고 하는 비트맵 이미지를 지원합니다.  PNG 이미지로 되어있는데 Stretchable(늘어나는) 영역을 정의할 수 있습니다. 이 나인패치 이미지는 보통 뷰(View)의 배경이미지로 사용됩니다. 실제 버튼의 디폴트 배경 이미지가 9 Patch 이미지로 되어있습니다. 

일반 PNG 이미지에서 1pixel의 보더를 가지는 형태로 구성되어있습니다. 이 보더가 늘어나는 영역과 늘어나지 않는 영역을 정의하게 됩니다. 왼쪽과 위쪽의 1 pixel 검은색 선은 늘어날 수 있는 부분을 정의합니다. 늘어날 수 있는 부분은 여러개가 될 수 있습니다. 

오른쪽과 아래쪽의 1 pixel 검은색 선은 뷰가 그려질 영역을 정하는 일을 합니다. 다시 말해 패딩 영역을 결정합니다. 만약 이 선을 그리지 않는다면 왼쪽과 위쪽의 선이 사용됩니다. 예를 들어 텍스트뷰의 경우 그려질 텍스트가 이 선이 그려진 영역안에서 표시됩니다.

나인패치 이미지를 쉽게 만들기 위해서 SDK의 Tools디렉토리에 draw9patch라고 하는 이미지 에디터가 들어있습니다. 아니면 그냥 일반적인 그래픽 에디터에서 그려도 상관없습니다.

ninepatch_raw.png

파일이름은 반드시 .9.png라고 끝나도록 저장해주어야 합니다. 



res/drawable/some_name.9.png 와 같은 형태가 되겠지요. 만약 그냥 png라고 끝난다면 



일반 이미지 파일로 처리가 됩니다.



package com.example.androidserversocket;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

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

public class MainActivity extends Activity {

 TextView info, infoip, msg;
 String message = "";
 ServerSocket serverSocket;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  info = (TextView) findViewById(R.id.info);
  infoip = (TextView) findViewById(R.id.infoip);
  msg = (TextView) findViewById(R.id.msg);
  
  infoip.setText(getIpAddress());

  Thread socketServerThread = new Thread(new SocketServerThread());
  socketServerThread.start();
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  if (serverSocket != null) {
   try {
    serverSocket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

 private class SocketServerThread extends Thread {

  static final int SocketServerPORT = 8080;
  int count = 0;

  @Override
  public void run() {
   try {
    serverSocket = new ServerSocket(SocketServerPORT);
    MainActivity.this.runOnUiThread(new Runnable() {

     @Override
     public void run() {
      info.setText("I'm waiting here: "
        + serverSocket.getLocalPort());
     }
    });

    while (true) {
     Socket socket = serverSocket.accept();
     count++;
     message += "#" + count + " from " + socket.getInetAddress()
       + ":" + socket.getPort() + "\n";

     MainActivity.this.runOnUiThread(new Runnable() {

      @Override
      public void run() {
       msg.setText(message);
      }
     });

     SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
       socket, count);
     socketServerReplyThread.run();

    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

 }

 private class SocketServerReplyThread extends Thread {

  private Socket hostThreadSocket;
  int cnt;

  SocketServerReplyThread(Socket socket, int c) {
   hostThreadSocket = socket;
   cnt = c;
  }

  @Override
  public void run() {
   OutputStream outputStream;
   String msgReply = "Hello from Android, you are #" + cnt;

   try {
    outputStream = hostThreadSocket.getOutputStream();
             PrintStream printStream = new PrintStream(outputStream);
             printStream.print(msgReply);
             printStream.close();

    message += "replayed: " + msgReply + "\n";

    MainActivity.this.runOnUiThread(new Runnable() {

     @Override
     public void run() {
      msg.setText(message);
     }
    });

   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    message += "Something wrong! " + e.toString() + "\n";
   }

   MainActivity.this.runOnUiThread(new Runnable() {

    @Override
    public void run() {
     msg.setText(message);
    }
   });
  }

 }

 private String getIpAddress() {
  String ip = "";
  try {
   Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
     .getNetworkInterfaces();
   while (enumNetworkInterfaces.hasMoreElements()) {
    NetworkInterface networkInterface = enumNetworkInterfaces
      .nextElement();
    Enumeration<InetAddress> enumInetAddress = networkInterface
      .getInetAddresses();
    while (enumInetAddress.hasMoreElements()) {
     InetAddress inetAddress = enumInetAddress.nextElement();

     if (inetAddress.isSiteLocalAddress()) {
      ip += "SiteLocalAddress: " 
        + inetAddress.getHostAddress() + "\n";
     }
     
    }

   }

  } catch (SocketException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   ip += "Something Wrong! " + e.toString() + "\n";
  }

  return ip;
 }
}

<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"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/infoip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </ScrollView>

</LinearLayout>

출저 : http://android-er.blogspot.kr/2014/02/android-sercerclient-example-server.html


lcd_bt_chat

블루투스를 이용한 아두이노-안드로이드 채팅

1. 아두이노-안드로이드 BT 채팅

블루투스를 이용한 아두이노와 안드로이드 간 채팅 시스템입니다. 아두이노-PC 간 USB 시리얼 연결로 사용자 입력을 받고 BT를 이용해서 안드로이드 폰으로 쏴줍니다. 안드로이드 폰에서도 사용자가 입력한 데이터를 BT를 이용해서 아두이노로 전달하고 전달된 메시지는 LCD 모듈에 표시됩니다. 소스, 구현이 간단하고 여러가지로 응용하기 좋습니다. 카페 공구를 이용하면 부품들도 저렴하게 구할 수 있습니다.

이미 거의 유사한 프로젝트가 GitHub 에 있으니 소스 참고하세요.

https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android

 

2. 구현 순서 

2-1. 아두이노

아두이노에서는 먼저 블루투스 모듈과 LCD 모듈을 연결합니다. 아래 별도로 작성해 둔 글을 참고해서 연결하시면 됩니다. 배선만 참고해서 연결하시고 소스코드는 이 글에 있는 소스를 사용하세요.

연결이 끝나면 아래 소스를 아두이노에 업로드 합니다.

PC에서 전달된 데이터를 안드로이드로 보내는 코드는 간단합니다. (2) 참고. Serial 연결에서 읽은 데이터를 BT로 넘겨주면 됩니다. 아두이노와 BT는 Software Serial 로 연결되기 때문에 SoftwareSerial.h 파일이 include 되어 있습니다.

안드로이드에서 전달해준 데이터를 LCD에 표시할 때는 약간의 처리를 해줘야 합니다. LCD가 16글자 2줄을 표시하기 때문에 적당히 줄넘김을 해줘야 합니다. Line break 를 식별할 수 있도록 안드로이드에서 처리해주지 않았기 때문에, 1초 이상 입력이 없으면 자동으로 줄넘김을 하도록 코딩 했습니다. (1) 참고. 만약 안드로이드에서 16자 이상을 한번에 보내면 16자 이후는 표시되지 않습니다. 구현하시는 분은 이 부분도 구현해보세요.

2-2. 안드로이드

안드로이드 앱 구현은 GitHub 프로젝트에 있는 소스를 빌드하시면 됩니다. 귀찮으면 아래에서 다운로드 하세요.

GitHub 소스 : https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android

안드로이드와 아두이노 BT 연결은 아래 순서대로 하세요.

  1. 먼저 아두이노를 켜서 HC-06 슬레이브 모듈이 페어링 대기상태에 들어가도록 합니다. (LED 깜빡깜빡)
  2. 위 GitHub 에서 받은 소스를 빌드하거나 아래 링크에서 APK 파일을 받아서 폰에 설치합니다.
  3. 폰의 설정 > 블루투스 에서 off 상태이면 BT on 으로 바꿉니다.
  4. BluetoothChat 앱을 실행 – 메뉴키 – Connect a device 선택
  5. Device List 에 HC-06 슬레이브 모듈이 보이는지 확인. 안보이면 Scan 버튼을 눌러서 찾아보고 그래도 안되면 1부터 다시합니다.
  6. HC-06 모듈이 보이면 선택 – 연결이 정상적으로 완료되면 챗팅 가능
  7. 폰으로 글 적으면 PC의 Serial Monitor에서 보이는지 확인합니다. 반대도 확인.

여기까지 완료되면 안드로이드와 아두이노 사이에 채팅이 가능합니다.

 

참고자료:


출저  : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/188

Here is the code for the Server.

001package chatappserver;
002 
003import java.net.*;
004import java.io.*;
005import java.util.Vector;
006import java.lang.*;
007 
008public class ChatappServer {
009     
010    private static int port = 1234;
011    private static ServerSocket server = null;
012    private static Socket clientSocket;
013    private static String line;
014    private static BufferedReader streamIn;
015    private static PrintStream streamOut;
016     
017     
018    private static Vector<String> usernames = new Vector<String>();
019    private static Vector<PrintStream> streams = new Vector<PrintStream>();
020     
021    public static void main(String[] args) throws IOException{
022         
023        try{
024            System.out.println("Connecting to port " + port + " ....");
025            server = new ServerSocket(port);
026            System.out.println("Chat application server is now running..");
027            while(true){
028            clientSocket = server.accept();
029            chatHandler c = new chatHandler(clientSocket);
030            c.start();
031            }
032        }
033        catch(IOException e){
034            System.out.println("Couldn't connect to the port!");
035        }
036        finally{
037            server.close();
038        }      
039    }
040     
041    private static class chatHandler extends Thread{
042         
043        private Socket clientSocket;
044         
045        public chatHandler(Socket clientSocket){           
046            super("chatHandler");
047            this.clientSocket = clientSocket;
048        }
049         
050        public void run(){
051            
052            try{
053              streamIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
054              streamOut = new PrintStream(clientSocket.getOutputStream(), true);
055             
056              while(true){
057                streamOut.println("Username");
058                String line = streamIn.readLine();
059                if (line == null){
060                    return;           
061                }
062                try{
063                    synchronized(usernames){
064                        if(!usernames.contains(line)){
065                            usernames.add(line);
066                            break;
067                        }
068                    }
069                }
070                catch(Exception e){
071                    System.out.println(e);
072                }               
073              }
074              streamOut.println("Welcome");
075              streams.add(streamOut);
076               
077              while(true){
078              String message = streamIn.readLine();
079              if(message == null){
080                  return;
081              }
082              for(PrintStream stream : streams){
083                  stream.println("From " + line + ": " + message);
084              }
085               
086            }
087            }
088            catch(IOException e){
089                System.out.println(e);
090                 
091            }
092            finally{
093                if(line != null && streamOut != null){
094                    usernames.remove(line);
095                    streams.remove(streamOut);
096                }
097                try{
098                    clientSocket.close();
099                }
100                catch(IOException e){
101                    System.out.println(e);
102                }
103                 
104            }
105             
106                 
107            }
108             
109             
110        }
111         
112    }




The Client code is here..

01package chatappclient;
02 
03import java.net.*;
04import java.io.*;
05import javax.swing.JFrame;
06import javax.swing.JTextArea;
07import javax.swing.JTextField;
08import javax.swing.JButton;
09import javax.swing.*;
10import java.awt.event.*;
11 
12public class ChatappClient {
13     
14    private static int port = 1234;
15    JFrame window = new JFrame("Chat");
16    JButton sendBox = new JButton("Send");
17    JTextField inputMsg = new JTextField(35);
18    JTextArea outputMsg = new JTextArea(1035);
19    private static BufferedReader streamIn;
20    private static PrintStream streamOut;
21     
22    public static void main(String[] args) throws Exception{
23        ChatappClient client = new ChatappClient();
24        client.window.setVisible(true);
25        client.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
26        client.run();       
27    }
28     
29    public ChatappClient(){
30         
31        inputMsg.setSize(4020);
32        sendBox.setSize(510);
33        outputMsg.setSize(3550);
34        inputMsg.setEditable(false);
35        outputMsg.setEditable(false);
36        window.getContentPane().add(inputMsg, "South");
37        window.getContentPane().add(outputMsg, "East");
38        window.getContentPane().add(sendBox, "West");
39        window.pack();
40        sendBox.addActionListener(new ActionListener(){
41            public void actionPerformed(ActionEvent e){
42                streamOut.println(inputMsg.getText());
43                inputMsg.setText("");
44            }
45        });
46        inputMsg.addActionListener(new ActionListener(){
47            public void actionPerformed(ActionEvent e){
48                streamOut.println(inputMsg.getText());
49                inputMsg.setText("");
50            }
51        });          
52    }
53     
54    private String getUsername(){
55        return JOptionPane.showInternalInputDialog(window, "Server IP Address:""Welcome to Chat", JOptionPane.QUESTION_MESSAGE);
56    }
57     
58    private void run() throws IOException{
59        Socket clientSocket = new Socket("localhost", port);
60        streamIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
61        streamOut = new PrintStream(clientSocket.getOutputStream(), true);
62     
63        while(true){
64            String line = streamIn.readLine();
65            if(line.startsWith("Username")){
66                streamOut.println(getUsername());
67            }else if(line.startsWith("Welcome")){
68                inputMsg.setEditable(true);
69            }else if(line.startsWith("From")){
70                outputMsg.append(line.substring(10)+ "\n");
71            }
72        }  
73    }
74}


출저 : http://www.dreamincode.net/forums/topic/277518-chat-using-socketssingle-server-with-multiple-clients/

안드로이드 카톡 프로필 여러장을 하나로 보이게 하는 방법에 대해

http://www.masterqna.com/android/61069/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B9%B4%ED%86%A1-%ED%94%84%EB%A1%9C%ED%95%84-%EC%97%AC%EB%9F%AC%EC%9E%A5%EC%9D%84-%ED%95%98%EB%82%98%EB%A1%9C-%EB%B3%B4%EC%9D%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4


https://hashcode.co.kr/questions/1341/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%82%AC%EC%A7%84-%EC%97%AC%EB%9F%AC%EC%9E%A5%EC%9D%84-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%B7%B0%EC%97%90-%EB%84%A3%EC%96%B4-rounding-%EC%B2%98%EB%A6%AC-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4



이미지 round 처리 방법


public static Bitmap getRoundedBitmap(Bitmap bitmap) {
    final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(output);
 
    final int color = Color.GRAY;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
 
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawOval(rectF, paint);
 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
 
    bitmap.recycle();
 
    return output;
  }


출저 : http://www.kmshack.kr/2013/07/%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-bitmap-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%9D%BC%EC%9A%B4%EB%94%A9-%EC%B2%98%EB%A6%AC%EB%B0%A9%EB%B2%95/



이미지 그리기에 관련된 블로거

http://baramziny.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-path%EB%A1%9C-%EA%B7%B8%EB%A6%AC%EA%B8%B0

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

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


    <item

        android:left="-2dp"

        android:right="-2dp">

        <shape android:shape="rectangle" >

            <stroke

                android:width="0.5dp"

                android:color="@color/silver" />


            <solid android:color="#00000000" />

        </shape>

    </item>


</layer-list>


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


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



위 두줄 실선 위 아래 선 주기

안드로이드 운영체계는 "SQLite" 데이터베이스를 기본으로 지원합니다.


SQLite의 사전적 의미는


"SQLite는 MyAQL이나 PostgreSQL과 같은 데이터베이스 관리 시스템이지만


서버가 아니라 응응프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다.


일반적인 RDBMS에 비해 대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다. 


또 API는 단순히 라이브러리를 호출하는 것만 있으며, 데이터를 저장하는 데 하나의 파일만을 사용하는 것이 특징이다." - Wikipedia


자세한 내용은 SQL 문법 참고 사이트를 방문해 보시기 바랍니다..




데이터베이스의 간단한 구성 : 테이블, 레코드, 필드

데이터베이스를 구성하는 요소는 참으로 다양하지만, 자주 쓰이는 것들은 기본적인 것들 몇 가지들입니다. 

1. 테이블


  테이블은 데이터들이 저장되어 있는 공간입니다. 테이블은 특정 주제에 관련된 데이터들을 담고 있으므로, 하나의 데이터베이스 내에는 여러 개의 테이블이 존재할 수 있습니다. 

2. 필드



필드는 각 항목의 "분류" 정도로 보면 되겠습니다. 전화번호부의 이름, 전화번호, 이메일주소 등이 필드에 해당됩니다.

3. 레코드



레코드는 하나의 항목과 관련된 필드의 값의 집합입니다. 예를 들면 위의 그림에서는 _id가 2, name은 google, phone은 12345 인 데이터의 집합이 하나의 레코드입니다. 이것 뿐 아니라 나머지 하이라이트된 4개 항목도 모두 레코드이지요. 전화번호부를 예로 들자면, 한 사람이 가지고 있는 데이터들(이름, 전화번호, 이메일주소)을 레코드라 할 수 있습니다.


안드로이드에서 데이터베이스 다루기 : 데이터베이스 어댑터

  데이터베이스를 생성하고, 열고, 데이터베이스에 데이터를 넣고, 쿼리를 통해서 데이터베이스에서 정보를 받아오는 작업은 SQLiteDatabase(android.database.sqlite.SQLiteDatabase) 와 SQLiteOpenHelper(android.database.sqlite.SQLiteOpenHelper) 내의 메소드를 통해 처리됩니다. 

  SQLiteDatabase 클래스에서는 데이터베이스를 다루는 작업(추가, 삭제, 수정, 쿼리)를 담당하고, SQLiteOpenHelper 클래스에스는 데이터베이스의 생성, 열기, 업그레이드를 담당합니다. 이러한 클래스 내의 메소드를 통해 직접 데이터베이스를 생성하고, 수정하고, 쿼리를 수행할 수도 있지만 이렇게 할 경우 코드상에 데이터베이스 구조들도 다 드러나게 되고, 실제로 코드를 볼 때에도 이 코드가 무엇을 하는 코드인지 바로 보기 불편합니다. 그래서, 일반적으로는 내가 사용할 데이터베이스에 맞게끔 데이터베이스 어댑터를 만들고 어댑터를 통해 데이터베이스를 관리합니다.


데이터베이스에서 원하는 자료를 받아오기 : 쿼리(query; 질의)

  데이터베이스를 생성하고 자료를 추가하는 것 못지않게 중요한 것이 바로 자신이 원하는 데이터베이스를 가져오는 것입니다. 이는 쿼리(Query; 질의)를 통해 이루어집니다. 질의 결과는 Cursor객체 형태로 반환됩니다.

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, 
String groupBy, String having, String orderBy, String limit) 

  • table  질의를 수행할 테이블 이름입니다.
  • columns  자료를 받아올 필드들입니다. null을 입력하면 모든 필드를 반환합니다.
  • selection  SQL의 "where" 구문에 해당되는 조건을 입력합니다. 조건이 많을 경우, ?로 대체합니다.
  • selectionArgs  selection을 ?로 지정하였을 경우, 그 조건들을 입력합니다.
  • groupBy  SQL의 "group by"구문에 해당합니다.
  • having  groupBy를 지정했을 경우, 그 조건을 넣어줍니다.
  • orderBy  결과값 정렬 방식을 지정합니다. null을 입력하면 기본 정렬을 수행합니다.
  • limit  결과값의 개수를 제한합니다.


(API : android.database.sqlite.SQLiteDatabase)
위에서 소개된 형태 외에도 다른 형태로 2가지 메소드가 있으니 참조하시면 됩니다.

예제)

1
2
3
4
            // 모든 레코드를 반환하는 쿼리를 실행합니다.
Cursor all = myDB.query("data", null, null, null, null, null, null, null);
            // 이름이 google인 레코드를 반환하는 쿼리를 실행합니다.
Cursor sel = myDB.query("data", "name = google", null, null, null, null, null, null);



데이터베이스 값을 가지는 객체, Cursors와 ContentValues

  데이터베이스 내에서 값을 추가하고, 삭제하고, 수정하는 작업돠는 별도로, 데이터베이스에 저장된 값을 코드 내로 가져와야 하거나, 코드 내에서 받은 값들을 데이터베이스에 추가시키는 과정이 있습니다. 우선, 데이터베이스의 데이터를 코드 내로 가져오는 것부터 보도록 하겠습니다.

데이터베이스 -> 코드 데이터 가져오기 : Cursor

  데이터베이스에서 자료를 가져올 때는 그 자료가 특정한 값 하나 (예:이름)이 될 수도 있고, 레코드가 될 수도 있고, 혹은 전체 데이터가 될 수도 있습니다. 이런 자료들을 받아오기 위해서 Cursor 인터페이스를 사용합니다. 
  커서는 쿼리(질의) 결과로 나온 레코드들을 가리키는, 말 그대로 마우스 "커서" 처럼 특정 레코드를 가리키는 역할을 합니다. 결과 레코드가 여러 개일 경우, 커서를 이리저리 움직이면서 여러 레코드들의 데이터들을 받아올 수 있습니다.


데이터베이스에서 커서는 특정 레코드를 가리키는 역할을 합니다.



Cursor 인터페이스의 주요 메소드는 다음과 같습니다.

  • moveToFirst  커서가 쿼리(질의) 결과 레코드들 중에서 가장 처음에 위치한 레코드를 가리키도록 합니다.
  • moveToNext  다음 레코드로 커서를 이동합니다.
  • moveToPrevious  이전 레코드로 커서를 이동합니다.
  • getCount  질의 결과값(레코드)의 갯수를 반환합니다.
  • getColumnIndexOrThrow  특정 필드의 인덱스값을 반환하며, 필드가 존재하지 않을경우 예외를 발생시킵니다.
  • getColumnName  특정 인덱스값에 해당하는 필드 이름을 반환합니다.
  • getColumnNames  필드 이름들을 String 배열 형태로 반환합니다.
  • moveToPosition  커서를 특정 레코드로 이동시킵니다.
  • getPosition  커서가 현재 가리키고 있는 위치를 반환합니다.


커서에서 데이터를 받아올 때에는,  get<데이터타입>(필드 인덱스메소드를 사용합니다.
위의 그림과 같은 질의 결과에서 이름을 받아오고 싶다면, 우선 이름 필드(name)의 인덱스를 알야아 합니다. 필드 인덱스는 일반적인 인덱스들과 마찬가지로 0부터 시작하므로 _id의 필드 인덱스는 0, name은 1, phone은 2가 되겠습니다. 참고로, 위 데이터베이스의 각 필드별 데이터 타입은 _id는 long, name은 String, phone은 long입니다.

필드 인덱스는 알았고, 받아올 데이터 타입이 String이므로 현재 레코드에서 이름을 받아오기 위해서는 getString(int ColumnIndex)메소드를 사용하면 됩니다. 즉, getString(1)이 되겠죠. 만약, 이름이 아니라 전화번호를 받아오고 싶다면 getLong(2)을 사용하면 되겠죠?

1
2
3
4
// 레코드로부터 이름을 받아옵니다.
String name = result.getString(1);
// 레코드로부터 전화번호를 받아옵니다.
long phone = result.getLong(2);



다른 데이터타입을 불러오는 메소드는 여기를 참조하세요.


코드 -> 데이터베이스에 자료 입력하기 : ContentValues

(android.content.ContentValues)
위의 Cursor와는 반대로, 자료를 데이터베이스에 입력하기 위해서 ContentValues 객체를 데이터베이스의 레코드와 동일하게 사용합니다. ContentValues 객체에 데이터베이스 테이블에 맞게 자료를 입력한 후, SQLiteDatabase 클래스의 insert()메소드를 사용하여 데이터베이스에 새로운 레코드를 추가합니다.

Cursor 형태로 된 쿼리 결과에서 데이터를 가져오는 것과 비슷하게, put(_필드 이름_, _입력할 값_)을 이용합니다.

1
2
3
4
5
6
// 필요한 데이터를 입력합니다.
ContentValues newValues = new ContentValues();
newValues.put("name", "구글");
newValues.put("phone", "1234567");
// 레코드를 추가합니다.
myDB.insert("data", null, newValues);


데이터베이스에 레코드를 추가하는 메소드인 insert()메소드에 대해 자세한 정보는 여기를 참고하세요. 


출저 : http://androidhuman.com/210

ㅁㅁ

[    ]

[    ]



java.txt


xml.txt



+ Recent posts