안녕하세요. 누누입니다.

연습 삼아 만들어본 sqlite를 이용한 리스트뷰와 소소한 기능들입니다.

우선 스핀킷의 오픈 라이브러리 주소입니다. 
https://github.com/ybq/Android-SpinKit

 

ybq/Android-SpinKit

Android loading animations. Contribute to ybq/Android-SpinKit development by creating an account on GitHub.

github.com

토글 버튼을 사용하여 타이머가 작동하는 상황을 시각적으로 표현하기 위해 만들었습니다.

 

 

MainActivity.class 입니다.

 

public class MainActivity extends AppCompatActivity {


    Context mContext = null;
    ArrayList spinnerArray = new ArrayList<>();
    ArrayList listArray = new ArrayList<>();
    ArrayList<Element> element = new ArrayList<Element>();
    Spinner spinner;
    EditText name,age;
    TextView result;
    Handler mHandler;
    SpinKitView spin_kit;
    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final DBHelper dbHelper = new DBHelper(getApplicationContext(),"Board.db",null,1);
        final ArrayAdapter listAdapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,listArray);
        final ListView listview = (ListView)findViewById(R.id.listview);
        final ToggleButton toggleButton = (ToggleButton)findViewById(R.id.toggleButton);
        mContext = this;
        spinner = (Spinner)findViewById(R.id.gender);
        name = (EditText) findViewById(R.id.name) ;
        age = (EditText) findViewById(R.id.age) ;
        result=(TextView)findViewById(R.id.result);
        spin_kit = (SpinKitView)findViewById(R.id.spin_kit);
        spin_kit.setVisibility(View.INVISIBLE);
        //스피너 리스트 목록
        spinnerArray.add("남자");
        spinnerArray.add("여자");

        //초기 EditText 데이터 넣기
        if(element.size()==0){
            dbHelper.insert("누누",27,"남자");
        }

        show(listAdapter,dbHelper,listview);

            name.setText(element.get(0).getName());
            age.setText(String.valueOf(element.get(0).getAge()));
            if(element.get(0).getGender().equals("남자") ){
                spinner.setSelection(0);
            }else{
                spinner.setSelection(1);
            }




        //토글버튼 리스너
        toggleButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if(toggleButton.isChecked()){
                    mHandler = new Handler(){
                        public void handleMessage(Message msg){
                            spin_kit.setVisibility(View.VISIBLE);
                            if(count<element.size()){
                                name.setText(element.get(count).getName());
                                age.setText(String.valueOf(element.get(count).getAge()));
                                if(element.get(count).getGender().equals("남자") ){
                                    spinner.setSelection(0);
                                }else{
                                    spinner.setSelection(1);
                                }
                                count++;
                                mHandler.sendEmptyMessageDelayed(0,5000);
                                Log.d("count : ", String.valueOf(count) + "|" + element.size());
                            }
                            else{
                                count=0;
                                handleMessage(msg);
                            }
                        }
                    };
                    mHandler.sendEmptyMessage(0);
                }else{
                    spin_kit.setVisibility(View.INVISIBLE);
                    mHandler.removeMessages(0);
                    name.setText(element.get(0).getName());
                    age.setText(String.valueOf(element.get(0).getAge()));
                    if(element.get(0).getGender().equals("남자") ){
                        spinner.setSelection(0);
                    }else{
                        spinner.setSelection(1);
                    }
                }
            }
        });


        ArrayAdapter arrayAdapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_dropdown_item,spinnerArray);
        spinner.setAdapter(arrayAdapter);

        //전송버튼 클릭 리스너
        findViewById(R.id.submit).setOnClickListener(new Button.OnClickListener(){
            public void onClick(View view){
                String names = name.getText().toString();
                int ages = Integer.parseInt(age.getText().toString());
                String  genders = spinner.getSelectedItem().toString();
                dbHelper.insert(names,ages,genders);
                show(listAdapter,dbHelper,listview);

            }
     });
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
                    dialogBuilder.setTitle(element.get(position).getName() + " | "+element.get(position).getAge() + " | "+element.get(position).getGender() + "\n");
                    dialogBuilder.setPositiveButton("지우기", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dbHelper.delete(element.get(position).getNum());
                            show(listAdapter,dbHelper,listview);
                        }
                    });
                    dialogBuilder.setNegativeButton("선택하기", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            name.setText(element.get(position).getName());
                            age.setText(String.valueOf(element.get(position).getAge()));
                            if(element.get(position).getGender().equals("남자") ){
                                spinner.setSelection(0);
                            }else{
                                spinner.setSelection(1);
                            }
                        }
                    });
                    dialogBuilder.show();
                }
            });
    }


    //셀렉트 보드 함수
    //뷰 변경사항 확인
    private void show(ArrayAdapter listAdapter,DBHelper dbHelper,ListView listview){
        listAdapter.clear();
        element.clear();
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM Board ORDER BY num DESC",null);
        if(cursor !=null){
            cursor.move(0);
            while(cursor.moveToNext()){
                int num = Integer.parseInt(cursor.getString(cursor.getColumnIndex("num")));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                int age = Integer.parseInt(cursor.getString(cursor.getColumnIndex("age")));
                String gender = cursor.getString(cursor.getColumnIndex("gender"));
                //객체에 DB내용 담기
                element.add(new Element(num,name,age,gender));
            }
            listview.setAdapter(listAdapter);
            for(Element element : element){
                listAdapter.add(element.getNum() +" | " +element.getName()+ " | " +element.getAge()+ " | " +element.getGender()+"\n");
            }
            listAdapter.notifyDataSetChanged();
        }
    }
}

 

 

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"
    android:orientation="vertical"
    tools:context=".MainActivity">
<LinearLayout
    android:layout_gravity="right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ToggleButton
        android:id="@+id/toggleButton"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textOn="5초마다 바뀜"
        android:textOff="맨위에것만 바뀜"
       />
</LinearLayout>
    <!--Spin Kit-->
    <com.github.ybq.android.spinkit.SpinKitView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/spin_kit"
        style="@style/SpinKitView.Large.Circle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:SpinKit_Color="@color/colorAccent" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_marginTop="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="이름 : "
                />

            <EditText
                android:id="@+id/name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="이름"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="나이 : "
                />

            <EditText
                android:id="@+id/age"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="나이"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="성별 : "
                />

            <Spinner
                android:id="@+id/gender"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            </Spinner>
        </LinearLayout>
        <LinearLayout
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:id="@+id/submit"
                android:text="전송하기"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />


        </LinearLayout>
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/result"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

            <com.dodola.listview.extlib.ListViewExt
                android:id="@+id/listview"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            </com.dodola.listview.extlib.ListViewExt>

        </LinearLayout>
    </LinearLayout>




    </LinearLayout>

 

 

DB 객체 Element 입니다.

 

public class Element implements Serializable {

    private int num;
    private String name;
    private int age;
    private String gender;

    public Element(int num,String name,int age,String gender){
        super();
        this.num =num;
        this.name = name;
        this.age = age;
        this. gender = gender;
    }
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Element{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

 

 

마지막으로 DBHelper입니다.

 

public class DBHelper extends SQLiteOpenHelper {

    // DBHelper 생성자로 관리할 DB 이름과 버전 정보를 받음
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    // DB를 새로 생성할 때 호출되는 함수
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 새로운 테이블 생성
        /* 이름은 BOARD이고, 자동으로 값이 증가하는 num 정수형 기본키 컬럼과
        name 문자열 컬럼, age 정수형 컬럼, gender 문자열 컬럼으로 구성된 테이블을 생성. */
        db.execSQL("CREATE TABLE BOARD (num INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, gender TEXT);");
    }

    // DB 업그레이드를 위해 버전이 변경될 때 호출되는 함수
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void insert(String name ,int age, String gender) {
        // 읽고 쓰기가 가능하게 DB 열기
        SQLiteDatabase db = getWritableDatabase();
        // DB에 입력한 값으로 행 추가
        db.execSQL("INSERT INTO BOARD VALUES(null, '" + name + "', " + age + ", '" + gender + "');");
        db.close();
    }

    public void update(String name, int age) {
        SQLiteDatabase db = getWritableDatabase();
        // 입력한 항목과 일치하는 행의 가격 정보 수정
        db.execSQL("UPDATE BOARD SET age=" + age + " WHERE name='" + name + "';");
        db.close();
    }

    public void delete(int num){
        SQLiteDatabase db = getWritableDatabase();
        // 입력한 항목과 일치하는 행의 가격 정보 수정
        db.execSQL("DELETE FROM BOARD WHERE num=" + num );
        db.close();
    }



    public String getResult() {

        // 읽기가 가능하게 DB 열기
        SQLiteDatabase db = getReadableDatabase();
        String result = "";

        // DB에 있는 데이터를 쉽게 처리하기 위해 Cursor를 사용하여 테이블에 있는 모든 데이터 출력
        Cursor cursor = db.rawQuery("SELECT * FROM BOARD", null);
        while (cursor.moveToNext()) {


            result += cursor.getString(cursor.getColumnIndex("num"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("name"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("age"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("gender"))
                    + "\n";

           /* result += cursor.getString(0)
                    + " | "
                    + cursor.getString(1)
                    + " | "
                    + cursor.getInt(2)
                    + " | "
                    + cursor.getString(3)
                    + "\n";*/
        }
        cursor.close();
        return result;
    }
}

build gradle에 

dependencies {

implementation 'com.dodola:listviewext:1.0'
implementation 'com.github.ybq:Android-SpinKit:1.2.0'

}

추가도 잊지 마세요!

 

실행화면과 설명입니다.

 

이름 성별 나이를 입력하시면 DB안에 데이터가 쌓이게 됩니다. 순서는 아래에서 위로 쌓이게 했습니다 ( 최신데이터가 가장 위로 올라오게) 그후 토글버튼을 클릭하시면 (오른쪽 위) 5초마다 위에서 아래로 데이터를 표시해줍니다. (텍스트 변경)

 

변경되는 뷰
다시 토글버튼을 누르면 가장 위쪽의 데이터로 변경되고 더이상 변경 사이클이 돌지 않습니다.

코드를 올리면서 생각해 봤는데... 토글이 동작하는중에는 전송버튼을 막아두는게 현명해 보입니다. 

 

코드를 이것저것 수정하면서 만든 거라 중복된 내용의 코드가 있을 수 있습니다. 발견 시 댓글 달아주시면 감사하겠습니다 ㅠ.

 

 

안녕하세요 누누입니다.

안드로이드 xml 뷰를 만들다 보면 여러 가지 레이아웃을 사용하게 됩니다.

 

RelativeLayout은 (0,0)좌표에 중첩되어 쌓이는 뷰입니다.

최상위 부모나 id를 참조해서 특정 뷰의 상대적인 위치를 지정 가능합니다. 

 

layout_above    ~의 위에 배치하라

layout_below    ~의 밑에 배치하라

layout_toLeftOf  ~의 왼쪽에 배치하라

layout_toRightOf ~의 오른쪽에 배치하라 

layout_alignTop     ~와 위쪽 변을 맞춰라
layout_alignBottom ~와 밑쪽 변을 맞춰라
layout_alignLeft     ~와 왼쪽 변을 맞춰라
layout_alignRight    ~와 오른쪽 변을 맞춰라

layout_alignParentTop     true이면 부모와 위쪽 변을 맞춰라
layout_alignParentBottom true이면 부모와 밑쪽 변을 맞춰라
layout_alignParentLeft     true이면 부모와 왼쪽 변을 맞춰라
layout_alignParentRight    true이면 부모와 오른쪽 변을 맞춰라

layout_centerHorizontal true이면 부모의 수평 중앙에 배치하라
layout_centerVertical    true이면 부모의 수직 중앙에 배치하라
layout_centerInParent   true이면 부모의 수평, 수직 중앙에 배치하라

layout_alignParentLeft   true이면 부모의 왼쪽으로 붙여라

layout_alignParentRight    true 이면 부모의 오른쪽으로 붙여라 

 

등 자주 사용하는 속성입니다.

 

LinearLayout은 가로 또는 세로로 순차적으로 나열되는 레이아웃입니다.

android:orientation=""으로 가로 또는 세로로 설정이 가능합니다. 

LinearLayout은 레이아웃안의 뷰들의 면적이 조절 가능합니다.

 

<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_marginTop="6.5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#929292"
android:lineSpacingExtra="5sp"
android:text="사고차량"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="#333333"
android:lineSpacingExtra="2sp"
android:text="12가 1234"
/>
</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:layout_marginTop="6.5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#929292"
android:lineSpacingExtra="5sp"
android:text=android:text="사고차종종"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="#333333"
android:lineSpacingExtra="2sp"
android:text="제네시스 G90"
/>
</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:layout_marginTop="6.5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#929292"
android:lineSpacingExtra="5sp"
android:text="사고유형"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="#333333"
android:lineSpacingExtra="2sp"
android:text=android:text="잠금장치해제"
/>
</LinearLayout>

 

다음과 같이 3개의 레이아웃을 삼분할하여 분배가 가능합니다.

 

 

자주 사용하는 두 가지의 레이아웃을 소개해드렸습니다. 짧은 소개였지만 레이아웃 안에서의 화면 분할을 원하시면 LinearLayout을 상대적인 위치 값을 이용하고 싶으시면 RelativeLayout을 사용하시면 되겠습니다.

 

다들 즐 코딩하세요 ^^!

MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
public class MainActivity extends AppCompatActivity {
 
 
    Context mContext = null;
    ArrayList spinnerArray = new ArrayList<>();
    ArrayList listArray = new ArrayList<>();
    ArrayList<Element> element = new ArrayList<Element>();
    Spinner spinner;
    EditText name,age;
    TextView result;
    Handler mHandler;
    SpinKitView spin_kit;
    int count = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final DBHelper dbHelper = new DBHelper(getApplicationContext(),"Board.db",null,1);
        final ArrayAdapter listAdapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,listArray);
        final ListView listview = (ListView)findViewById(R.id.listview);
        final ToggleButton toggleButton = (ToggleButton)findViewById(R.id.toggleButton);
        mContext = this;
        spinner = (Spinner)findViewById(R.id.gender);
        name = (EditText) findViewById(R.id.name) ;
        age = (EditText) findViewById(R.id.age) ;
        result=(TextView)findViewById(R.id.result);
        spin_kit = (SpinKitView)findViewById(R.id.spin_kit);
        spin_kit.setVisibility(View.INVISIBLE);
        //스피너 리스트 목록
        spinnerArray.add("남자");
        spinnerArray.add("여자");
 
        //초기 EditText 데이터 넣기
        show(listAdapter,dbHelper,listview);
        name.setText(element.get(0).getName());
        age.setText(String.valueOf(element.get(0).getAge()));
        if(element.get(0).getGender().equals("남자") ){
            spinner.setSelection(0);
        }else{
            spinner.setSelection(1);
        }
 
        //토글버튼 리스너
        toggleButton.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                if(toggleButton.isChecked()){
                    mHandler = new Handler(){
                        public void handleMessage(Message msg){
                            spin_kit.setVisibility(View.VISIBLE);
                            if(count<element.size()){
                                name.setText(element.get(count).getName());
                                age.setText(String.valueOf(element.get(count).getAge()));
                                if(element.get(count).getGender().equals("남자") ){
                                    spinner.setSelection(0);
                                }else{
                                    spinner.setSelection(1);
                                }
                                count++;
                                mHandler.sendEmptyMessageDelayed(0,5000);
                                Log.d("count : "String.valueOf(count) + "|" + element.size());
                            }
                            else{
                                count=0;
                                handleMessage(msg);
                            }
                        }
                    };
                    mHandler.sendEmptyMessage(0);
                }else{
                    spin_kit.setVisibility(View.INVISIBLE);
                    mHandler.removeMessages(0);
                    name.setText(element.get(0).getName());
                    age.setText(String.valueOf(element.get(0).getAge()));
                    if(element.get(0).getGender().equals("남자") ){
                        spinner.setSelection(0);
                    }else{
                        spinner.setSelection(1);
                    }
                }
            }
        });
 
 
        ArrayAdapter arrayAdapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_dropdown_item,spinnerArray);
        spinner.setAdapter(arrayAdapter);
 
        //전송버튼 클릭 리스너
        findViewById(R.id.submit).setOnClickListener(new Button.OnClickListener(){
            public void onClick(View view){
                String names = name.getText().toString();
                int ages = Integer.parseInt(age.getText().toString());
                String  genders = spinner.getSelectedItem().toString();
                dbHelper.insert(names,ages,genders);
                show(listAdapter,dbHelper,listview);
 
            }
     });
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 
                @Override
                public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
                    dialogBuilder.setTitle(element.get(position).getName() + " | "+element.get(position).getAge() + " | "+element.get(position).getGender() + "\n");
                    dialogBuilder.setPositiveButton("지우기"new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dbHelper.delete(element.get(position).getNum());
                            show(listAdapter,dbHelper,listview);
                        }
                    });
                    dialogBuilder.setNegativeButton("선택하기"new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            name.setText(element.get(position).getName());
                            age.setText(String.valueOf(element.get(position).getAge()));
                            if(element.get(position).getGender().equals("남자") ){
                                spinner.setSelection(0);
                            }else{
                                spinner.setSelection(1);
                            }
                        }
                    });
                    dialogBuilder.show();
                }
            });
    }
 
 
    //셀렉트 보드 함수
    //뷰 변경사항 확인
    private void show(ArrayAdapter listAdapter,DBHelper dbHelper,ListView listview){
        listAdapter.clear();
        element.clear();
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM Board ORDER BY num DESC",null);
        if(cursor !=null){
            cursor.move(0);
            while(cursor.moveToNext()){
                int num = Integer.parseInt(cursor.getString(cursor.getColumnIndex("num")));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                int age = Integer.parseInt(cursor.getString(cursor.getColumnIndex("age")));
                String gender = cursor.getString(cursor.getColumnIndex("gender"));
                //객체에 DB내용 담기
                element.add(new Element(num,name,age,gender));
            }
            listview.setAdapter(listAdapter);
            for(Element element : element){
                listAdapter.add(element.getNum() +" | " +element.getName()+ " | " +element.getAge()+ " | " +element.getGender()+"\n");
            }
            listAdapter.notifyDataSetChanged();
        }
    }
}
 
 


객체 Element 객체를 활용하여 getset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class Element implements Serializable {
 
    private int num;
    private String name;
    private int age;
    private String gender;
 
    public Element(int num,String name,int age,String gender){
        super();
        this.num =num;
        this.name = name;
        this.age = age;
        this. gender = gender;
    }
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    @Override
    public String toString() {
        return "Element{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}
 
 

DB HELPER 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
public class DBHelper extends SQLiteOpenHelper {
 
    // DBHelper 생성자로 관리할 DB 이름과 버전 정보를 받음
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
 
    // DB를 새로 생성할 때 호출되는 함수
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 새로운 테이블 생성
        /* 이름은 BOARD이고, 자동으로 값이 증가하는 num 정수형 기본키 컬럼과
        name 문자열 컬럼, age 정수형 컬럼, gender 문자열 컬럼으로 구성된 테이블을 생성. */
        db.execSQL("CREATE TABLE BOARD (num INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, gender TEXT);");
    }
 
    // DB 업그레이드를 위해 버전이 변경될 때 호출되는 함수
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
 
    public void insert(String name ,int age, String gender) {
        // 읽고 쓰기가 가능하게 DB 열기
        SQLiteDatabase db = getWritableDatabase();
        // DB에 입력한 값으로 행 추가
        db.execSQL("INSERT INTO BOARD VALUES(null, '" + name + "', " + age + ", '" + gender + "');");
        db.close();
    }
 
    public void update(String name, int age) {
        SQLiteDatabase db = getWritableDatabase();
        // 입력한 항목과 일치하는 행의 가격 정보 수정
        db.execSQL("UPDATE BOARD SET age=" + age + " WHERE name='" + name + "';");
        db.close();
    }
 
    public void delete(int num){
        SQLiteDatabase db = getWritableDatabase();
        // 입력한 항목과 일치하는 행의 가격 정보 수정
        db.execSQL("DELETE FROM BOARD WHERE num=" + num );
        db.close();
    }
 
 
 
    public String getResult() {
 
        // 읽기가 가능하게 DB 열기
        SQLiteDatabase db = getReadableDatabase();
        String result = "";
 
        // DB에 있는 데이터를 쉽게 처리하기 위해 Cursor를 사용하여 테이블에 있는 모든 데이터 출력
        Cursor cursor = db.rawQuery("SELECT * FROM BOARD"null);
        while (cursor.moveToNext()) {
 
 
            result += cursor.getString(cursor.getColumnIndex("num"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("name"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("age"))
                    + " | "
                    + cursor.getString(cursor.getColumnIndex("gender"))
                    + "\n";
 
           /* result += cursor.getString(0)
                    + " | "
                    + cursor.getString(1)
                    + " | "
                    + cursor.getInt(2)
                    + " | "
                    + cursor.getString(3)
                    + "\n";*/
        }
        cursor.close();
        return result;
    }
 
 
 

build.gradle github입니다.

아래의 추가해주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
repositories {
    maven {
        url  "http://dl.bintray.com/dodola/maven"
    }
}
 
dependencies {
    /*리스트뷰를 아래나 위로 당겼을때 발생하는 애니메이션입니다. (출렁거림)*/
    implementation 'com.dodola:listviewext:1.0'
    
    /*5초마다 발생하는 이벤트에 들어갈 spinkit입니다.*/
    implementation 'com.github.ybq:Android-SpinKit:1.2.0'
}
 
 

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?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"
    android:orientation="vertical"
    tools:context=".MainActivity">
<LinearLayout
    android:layout_gravity="right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
 
    <ToggleButton
        android:id="@+id/toggleButton"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textOn="5초마다 바뀜"
        android:textOff="맨위에것만 바뀜"
       />
</LinearLayout>
    <!--Spin Kit-->
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/spin_kit"
        style="@style/SpinKitView.Large.Circle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:SpinKit_Color="@color/colorAccent" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_marginTop="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
 
        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
 
            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="이름 : "
                />
 
            <EditText
                android:id="@+id/name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="이름"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
 
            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="나이 : "
                />
 
            <EditText
                android:id="@+id/age"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="나이"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
 
            <TextView
                android:textSize="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="성별 : "
                />
 
            <Spinner
                android:id="@+id/gender"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
 
            </Spinner>
        </LinearLayout>
        <LinearLayout
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
 
            <Button
                android:id="@+id/submit"
                android:text="전송하기"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
 
 
        </LinearLayout>
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
 
            <TextView
                android:id="@+id/result"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
 
                android:id="@+id/listview"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
 
            </com.dodola.listview.extlib.ListViewExt>
 
        </LinearLayout>
    </LinearLayout>
 
 
 
 
    </LinearLayout>
 
 
 

아직 정확한 사용법을 자세히 알지는 못하지만 연습하는 과정을 공유합니다. 
수정 부분이나 좀 더 효율적으로 사용하는 방법이 있으면 댓글 달아주세요.

//특정 지점이 해당 폴리곤에 속하는지 검사한다.
public static boolean bCheckPoint (ArrayList list, double x, double y) {
boolean c;
int i, l, j;

   for (c = false, i = -1, l = list.size(), j = l - 1; ++i < l; j = i) {
      HashMap data_i = (HashMap)list.get(i);
      HashMap data_j = (HashMap)list.get(j);
      
      double i_x = Double.parseDouble(String.valueOf(data_i.get("gps_x")));
  double i_y = Double.parseDouble(String.valueOf(data_i.get("gps_y")));
  
  double j_x = Double.parseDouble(String.valueOf(data_j.get("gps_x")));
  double j_y = Double.parseDouble(String.valueOf(data_j.get("gps_y")));
      
  if ( ((i_y <= y && y < j_y) || (j_y <= y && y < i_y)) && (x < (j_x - i_x) * (y - i_y) / (j_y - i_y) + i_x))
  c = !c;
  
  if ((x == i_x && y == i_y) || (x == j_x && y == j_y)){
  c = true;
  }
   }
   return c;
}

 

ArrayList list 값 안에 해당 버퍼 라인을 넣음. 

x,y의 값을 넣어서 폴리곤알고리즘에 속하는지 검사 

- 버퍼라인을 마커를 통해서 찍어서 리스트를 가져와야하고 폴리곤알고리즘의 개념을 이해해야함

- 해당경로를 벗어나면 마커의 모양을 바꾸기 위해서 사용하였음.

SELECT  userid, gps_x, gps_y ,routescode, DATE_FORMAT(updatedate, '%Y-%m-%d %h:%i:%s') as updatedate
FROM  test.gpsinfo 
WHERE SEQ IN (
    SELECT  max(seq) 
    FROM  test.gpsinfo 
    GROUP BY userid
);

 

 SELECT  max(seq)  
    FROM  test.gpsinfo  
    GROUP BY userid  으로 userid 의 max(seq) 값을 찾고 max(seq)인 값의 데이터를 가져옴

'프로그래밍 > sql,php' 카테고리의 다른 글

sqlite 컬럼검사  (0) 2019.07.19
DATE_FORMAT , INTERVAL , TIMESTAMP  (0) 2019.05.23
sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 4일차  (0) 2018.11.19

mysql DATA_FORMAT 예제

 

SELECT userid, gps_x, gps_y ,routescode, DATE_FORMAT(updatedate, '%Y-%m-%d %h:%i:%s') as updatedate
FROM  test.gpsinfo 
WHERE updatedate > date_sub(now(),interval 10 second);

 

DB Query updatedate 는 TIMESTAMP입니다.

10초전~현재까지의 업데이트 데이터 DATE_FORMAT을 사용하면 String형으로 바로 받아 사용가능함

'프로그래밍 > sql,php' 카테고리의 다른 글

sqlite 컬럼검사  (0) 2019.07.19
MYSQL MAX 쿼리를 이용하여  (0) 2019.05.23
sql> PL/SQL 2일차  (0) 2018.11.22
sql>오라클 DB수업 6일차 + PL/SQL START  (0) 2018.11.21
sql> 오라클db 수업 4일차  (0) 2018.11.19

eclipse 마켓 검색시 svn 나오지 않고 웹브러우저를 통하여 끌어서 다운로드 할경우에도 

 

the following solutions are not compatible with this version of eclipse 라는 에러문구와 함께 다운로드가 안되는 경우가 있습니다.

 

그럴땐 Help -> Install New Software 를 들어가서 

 

add 버튼을 클릭후 

name : update 

Location: http://download.eclipse.org/technology/subversive/4.0/update-site/

 

${project.name}

 

download.eclipse.org

을 입력하시고 검색창에 svn 을 입력하시어 다운로드 하시면 됩니다.

'프로그래밍 > Java,eclipse' 카테고리의 다른 글

http multipartRequest 사진전송,파일전송 (저장용)  (0) 2021.07.15
이해하기 폴리곤 알고리즘  (0) 2019.05.23
배경 테마 바꾸기  (0) 2018.10.25
연산자의 종류  (0) 2018.10.25
자바 자료형의 종류  (0) 2018.10.25

결과




HTML 


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
ul {
padding: 0;
margin: 0;
list-style: none;
}
ul li {
padding: 0;
margin: 0 0 10px 0;
}
</style>
</head>
<body>
<form action="do.jsp" method="post">
<!-- fieldset : 폼을 그룹핑하는 역할
legend : 제목 지정
-->
<fieldset>
<legend>프로젝트 정보</legend>
<ul>
<li>
<!-- autofocus:페이지 로드시 자동 포커스 지정
required:입력 필수 지정
--> <label for="name">이름</label> <input type="text" name="name"
id="name" autofocus="autofocus" required="required">
</li>
<li><label>중요도</label> <input type="range" name="priority"
id="priority" min="0" max="10" value="0"></li>
<li>
<!-- number:숫자필드 --> <label for="hour">예상 시간</label> <input
type="number" name="hour" id="hour" min="0" max="1000"
required="required">
</li>
<li>
<!-- date:날짜필드 --> <label for="start_date">시작 날짜</label> <input
type="date" name="start_date" id="start_date">
</li>
<li>
<!-- 이메일 필드 --> <label for="email">이메일</label> <input type="email"
name="email" id="email">
</li>
<li>
<!-- url 필드 --> <label for="url">URL</label> <input type="url"
name="url" id="url">
</li>
<li>
<!-- search :seacrch 필드 --> <label for="search">검색</label> <input
type="search" name="search" id="search">
</li>
<li><input type="submit" value="전송"></li>
</ul>
</fieldset>
</form>
</body>
</html>



















+ Recent posts