๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Android

Android::๋ฆฌ์ŠคํŠธ๋ทฐ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ์žฅ๋งŒ๋“ค๊ธฐ

by ๋„์บ๋ฆฌ๐Ÿฑ 2020. 7. 24.
๋ฐ˜์‘ํ˜•

โ— ์™„์„ฑํ•œ ๋ทฐ

[O] ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ ์ถ”๊ฐ€

[O] ๋ฉ”๋ชจ ํด๋ฆญ์‹œ ํŽธ์ง‘

[O] ๋ฉ”๋ชจ ๋กฑํด๋ฆญ์‹œ ์‚ญ์ œ ๊ฐ€๋Šฅ

[X] ๊ฒ€์ƒ‰

โ— ์ž‘์„ฑํ•œ ์ฝ”๋“œ

 

MainActivity

package com.example.memoapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class MainActivity extends AppCompatActivity {

    ArrayList<Memo> memoArrayList = new ArrayList<>();

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

        ImageButton backBtn = findViewById(R.id.main_btn_back);
        ImageButton searchBtn = findViewById(R.id.main_btn_search);
        ImageButton newBtn = findViewById(R.id.main_btn_add_text);
        TextView memoCount = findViewById(R.id.main_tv_count);


        //DBHelper ๊ฐ์ฒด ์ƒ์„ฑ
        String dbName = "Memo.db";
        int dbVersion =1;
        final DBHelper dbHelper;

        // memoArrayList ์— ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์„œ ๊ฐ€์ ธ์™€์ฃผ๊ธฐ
        dbHelper = new DBHelper(this,dbName,null,dbVersion);
        final SQLiteDatabase db = dbHelper.getReadableDatabase();
        final String sql = "SELECT * FROM Memo;";
        Cursor cursor = db.rawQuery(sql,null);
        memoCount.setText(String.valueOf(cursor.getCount()));   // ๋ฉ”๋ชจ์žฅ ๊ฐฏ์ˆ˜ ์บ์ŠคํŒ…
        try{
            if(cursor.getCount()>0)
            {
                while(cursor.moveToNext())
                {
                    // ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๊ฐ’๋“ค์˜ string ๊ฐ’์„ Memo ํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ๋‹ด์•„์„œ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
                    // ๋”๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—….

                    Memo m = new Memo(cursor.getString(1),cursor.getString(2));
                    memoArrayList.add(m);
                }
            }
        }finally {
            cursor.close();
        }


        // Dummies
        // memoArrayList.add(new Memo("Today's Diary", "a;laj;alksjdg;lasjdgljewjf;aklvmjdlfjl;aksnvldfddasdfasdfadfasdfasdfadsfaa"));
        // memoArrayList.add(new Memo("TO DO LIST", "aasvadsgmjdlfjl;aksnvldfddasdfasdfadfasdfasdfadsfaa"));
        // memoArrayList.add(new Memo("Homework", "aasdgasdgdgljewjf;aklvmjdlfjl;aksnvldfddasdfasdfadfasdfasdfadsfaa"));

        // ๋ฆฌ์ŠคํŠธ ๋ทฐ ์—ฐ๊ฒฐ
        final ListView listView = findViewById(R.id.main_lv_memo_list);
        MemoAdapter memoAdapter = new MemoAdapter(memoArrayList,this);
        listView.setAdapter(memoAdapter);


        // ๋ฆฌ์ŠคํŠธ ๋ทฐ ๋‚ด ์•„์ดํ…œ ํด๋ฆญ์‹œ → Edit ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // ๋ฆฌ์ŠคํŠธ ๋ทฐ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ EditActivity ๋กœ ๋„˜์–ด๊ฐ€์•ผํ•œ๋‹ค.
                // ์ด๋•Œ ํด๋ฆญ๋œ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” title ๊ณผ, contents ๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ ์ค˜์•ผ ํ•œ๋‹ค.
                int check_position = listView.getCheckedItemPosition(); //๋ฆฌ์ŠคํŠธ ๋ทฐ์˜ ํฌ์ง€์…˜์„ ๊ฐ€์ ธ์˜ด.
                Memo vo =(Memo)parent.getAdapter().getItem(position);  //๋ฆฌ์ŠคํŠธ ๋ทฐ์˜ ํฌ์ง€์…˜ ๊ฐ€์ ธ์˜ด.
                String t_title = vo.getTitle();
                String c_contents =vo.getContents();

                Intent intent = new Intent(MainActivity.this,EditActivity.class);
                intent.putExtra("title",t_title);
                intent.putExtra("contents",c_contents);
                intent.putExtra("position",position);

                startActivity(intent);
                finish();
            }


        });

        // ๋ฆฌ์ŠคํŠธ ๋ทฐ ๋‚ด ์•„์ดํ…œ ๋กฑ ํด๋ฆญ์‹œ → AlertDialog ๋กœ "์‚ญ์ œ" ๊ฐ€ ๋œจ๊ณ  "์‚ญ์ œ"๋ฅผ ๋ˆ„๋ฅผ์‹œ์— ๊ทธ ์•„์ดํ…œ ์‚ญ์ œ
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Memo vo =(Memo)parent.getAdapter().getItem(position);  //๋ฆฌ์ŠคํŠธ ๋ทฐ์˜ ํฌ์ง€์…˜ ๊ฐ€์ ธ์˜ด.
                final String t_title = vo.getTitle();
                String c_contents =vo.getContents();
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                       // ๋ฉ”๋ชจ ์‚ญ์ œ ์ž‘์—…
                        String sql0 ="DELETE FROM Memo WHERE title = '"+ t_title +"';";
                        db.execSQL(sql0);

                        Intent intent = new Intent(MainActivity.this, MainActivity.class);
                        finish();
                        startActivity(intent);

                    }
                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.setMessage("Do you want to delete this memo?");
                builder.setTitle("Delete Notification");
                builder.show();
                return true;
            }
        });


        // ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ์‹œ์— ์ฒ˜๋ฆฌ.
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // ์ด ์•กํ‹ฐ๋น„ํ‹ฐ ์ข…๋ฃŒ
                        finish();
                    }
                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.setMessage("Do you want to quit this app?");
                builder.setTitle("Exit Notification");
                builder.show();
            }
        });

        // ์ฐพ๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ์‹œ์— ์ฒ˜๋ฆฌ
        searchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // alertDialog ๊ฐ€ ์•„๋‹ˆ๋ผ dialog ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊ฑด๋ฐ, ๊ทธ๋Ÿฌ๋ ค๋จผ xml ํŒŒ์ผ์ด ๋”ฐ๋กœ ํ•„์š”ํ•˜๋‹ค.
                Dialog dialog = new Dialog(MainActivity.this);
                dialog.setContentView(R.layout.search_dialog);
                dialog.show();

                ImageButton dialog_search_btn = dialog.findViewById(R.id.search_dialog_btn);
                final EditText dialog_search_et = dialog.findViewById(R.id.search_dialog_et_title);

                dialog_search_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String title = dialog_search_et.getText().toString();
                        String sql0 ="SELECT * FROM Memo WHERE title = '"+ title +"';";
                        Cursor cs = db.rawQuery(sql0,null);

                        String get_title = cs.getString(1);
                        String get_contents = cs.getString(2);

                        Intent intent = new Intent(MainActivity.this,EditActivity.class);
                        intent.putExtra("title",get_title);
                        intent.putExtra("contents",get_contents);

                        startActivity(intent);
                        finish();

                    }
                });

            }
        });

        // New ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ์‹œ์— ์ฒ˜๋ฆฌ → detail Activity ๋กœ ๋ณด๋‚ด์ฃผ๊ณ  ๊ฑฐ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ํ•˜๊ฒŒ๋” ํ•  ๊ฒƒ์ด๋‹ค.
        newBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,DetailActivity.class);
                finish();   //์ž๊พธ ์Œ“์ด๋Š” ๊ฒƒ ๋ฐฉ์ง€.
                startActivity(intent);
            }
        });

    }
}

 

 

 

 

 

EditActivity

package com.example.memoapplication;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

public class EditActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        getSupportActionBar().hide();

        //DBHelper ๊ฐ์ฒด ์ƒ์„ฑ
        String dbName = "Memo.db";
        int dbVersion =1;
        final DBHelper dbHelper;
        dbHelper = new DBHelper(this,dbName,null,dbVersion);

        Intent intent = getIntent();
        final String got_title = intent.getStringExtra("title");
        String got_contents = intent.getStringExtra("contents");
        int got_positon = intent.getIntExtra("position",0);

        final EditText title = findViewById(R.id.detail_et_title);
        final EditText contents = findViewById(R.id.detail_et_contents);
        ImageButton save_btn = findViewById(R.id.detail_ib_save);
        ImageButton cancel_btn = findViewById(R.id.detail_ib_cancel);
        ImageButton back_btn = findViewById(R.id.detail_ib_back);

        title.setText(got_title);
        contents.setText(got_contents);



        save_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ์ด ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.
                // ๋ฐ›์•„์˜จ title ๋กœ  ์กฐํšŒํ•ด์„œ ๋ฐ”๊พผ๋‹ค.
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                String final_title = title.getText().toString();
                String final_contents = contents.getText().toString();
                String sql = "UPDATE Memo SET title='"+final_title+"',contents='"+final_contents+"'WHERE title='"+got_title+"';";
                db.execSQL(sql);

                AlertDialog.Builder builder = new AlertDialog.Builder(EditActivity.this);

                builder.setNegativeButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.setMessage("The note has been saved well :)");
                builder.setTitle("Notification");
                builder.show();
            }
        });

        cancel_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ๋ฉ”์ธ์œผ๋กœ ๋‹ค์‹œ
                Intent intent = new Intent(EditActivity.this, MainActivity.class);
                finish();
                startActivity(intent);

            }
        });

        back_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ๋ฉ”์ธ์œผ๋กœ ๋‹ค์‹œ
                Intent intent = new Intent(EditActivity.this, MainActivity.class);
                finish();
                startActivity(intent);
            }
        });

    }

    @Override
    protected void onPause() {
        super.onPause();
    }
}

 

 

 

 

 

DetailActivity

package com.example.memoapplication;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

public class DetailActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        getSupportActionBar().hide();

        //DBHelper ๊ฐ์ฒด ์ƒ์„ฑ
        String dbName = "Memo.db";
        int dbVersion =1;
        final DBHelper dbHelper;
        dbHelper = new DBHelper(this,dbName,null,dbVersion);


        final EditText title = findViewById(R.id.detail_et_title);
        final EditText contents = findViewById(R.id.detail_et_contents);
        ImageButton save_btn = findViewById(R.id.detail_ib_save);
        ImageButton cancel_btn = findViewById(R.id.detail_ib_cancel);

        // final String titleStr = title.getText().toString();
        // final String contentsStr =contents.getText().toString();

        // save_btn ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋“ค์–ด๊ฐ„๋‹ค.
        save_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String titleStr = title.getText().toString();
                String contentsStr =contents.getText().toString();

                SQLiteDatabase db = dbHelper.getWritableDatabase();
                String sql = String.format("INSERT INTO Memo VALUES(NULL,'%s','%s');", titleStr, contentsStr);
                db.execSQL(sql);
                // ์ €์žฅ ๋œ๋‹ค๋ฉด toast ๋ฉ”์„ธ์ง€ ๊ฐ™์€ ๊ฑฐ ๋„์šฐ๊ธฐ
                Toast.makeText(getApplicationContext(),"save well.",Toast.LENGTH_SHORT).show();
            }
        });

        // cancel_btn ์„ ๋ˆ„๋ฅด๋ฉด ์ด ์•กํ‹ฐ๋น„ํ‹ฐ ๋๋‚ด๊ณ  main ํ™”๋ฉด ๋Œ์•„๊ฐ„๋‹ค.
        cancel_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(DetailActivity.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }

    @Override
    // ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, Alert ๋œจ๊ณ  ์ด ์•กํ‹ฐ๋น„ํ‹ฐ ์—†์• ๊ณ  Main ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ.
    public void onBackPressed() {
        super.onBackPressed();
        AlertDialog.Builder builder = new AlertDialog.Builder(DetailActivity.this);

        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(DetailActivity.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.setMessage("back to the previous screen?");
        builder.setTitle("Notification");
        builder.show();
    }

    @Override
    protected void onPause() {
        // ์ž‘์„ฑ ์ค‘์ธ ๋ฉ”๋ชจ contents ์ €์žฅ ํ•ด ๋†“์•„์•ผ ํ•œ๋‹ค.
        super.onPause();
    }
}

 

 

 

 

 

DBHelper

package com.example.memoapplication;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    // DB ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ : ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE Memo (id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "title String PRIMARY KEY, contents String);");
    }

    // ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด DB๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ ๋‹ค.
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS Memo");
        onCreate(db);
    }
}

 

 

Memo

package com.example.memoapplication;

public class Memo {
    String title;
    String contents;

    public Memo(String title, String contents) {
        this.title = title;
        this.contents = contents;
    }

    public String getContents() {
        return contents;
    }

    public String getTitle() {
        return title;
    }
}

 

 

 

 

 

MemoAdapter

package com.example.memoapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import androidx.constraintlayout.widget.ConstraintLayout;

import java.util.ArrayList;

public class MemoAdapter extends BaseAdapter {
    ArrayList<Memo> memoArrayList = new ArrayList<>();
    Context mContext;

    public MemoAdapter(ArrayList<Memo> memoArrayList, Context mContext) {
        this.memoArrayList = memoArrayList;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return memoArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return memoArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.item_memo,parent,false);

        TextView tvTitle = itemView.findViewById(R.id.memo_tv_title);
        TextView tvContents = itemView.findViewById(R.id.memo_tv_contents);

        tvTitle.setText(memoArrayList.get(position).title);
        tvContents.setText(memoArrayList.get(position).contents);

        return itemView;
    }
}

 

โ— ์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ

objectํด๋ž˜์Šค์˜ getClass ๋ฉ”์†Œ๋“œ๋ž€? 

zzdd1558.tistory.com/57

โ˜… Android Cursor๋ฅผ ์ด์šฉํ•œ DB ๋ฐ์ดํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

arabiannight.tistory.com/entry/368

ํ† ์ŠคํŠธ ๋ฉ”์„ธ์ง€ ๋„์šฐ๊ธฐ

m.blog.naver.com/PostView.nhn?blogId=seungbin0619&logNo=221221022763&proxyReferer=https:%2F%2Fwww.google.com%2F

โ˜… ๋ชจ๋“  Activity์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ -DB ์‚ฌ์šฉ๋ฒ•

m.blog.naver.com/PostView.nhn?blogId=hg1286&logNo=220539030447&proxyReferer=https:%2F%2Fwww.google.com%2F
๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ํด๋ฆญ

kitesoft.tistory.com/67

๋กฑํด๋ฆญ

bitsoul.tistory.com/11

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€