package com.tistory.webnautes.sqllite_example;
import android.app.Activity; import android.os.Bundle;
import java.util.ArrayList; import java.util.HashMap;
import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.util.Log; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast;
public class MainActivity extends Activity {
private final String dbName = "webnautes"; private final String tableName = "person";
private String names[]; { names = new String[]{"Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "Kitkat"}; }
private final String phones[]; { phones = new String[]{"Android 1.5", "Android 1.6", "Android 2.0", "Android 2.2", "Android 2.3", "Android 3.0", "Android 4.0", "Android 4.1", "Android 4.4"}; }
ArrayList<HashMap<String, String>> personList; ListView list; private static final String TAG_NAME = "name"; private static final String TAG_PHONE ="phone";
SQLiteDatabase sampleDB = null; ListAdapter adapter;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.listView); personList = new ArrayList<HashMap<String,String>>();
try {
sampleDB = this.openOrCreateDatabase(dbName, MODE_PRIVATE, null);
//테이블이 존재하지 않으면 새로 생성합니다. sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR(20), phone VARCHAR(20) );");
//테이블이 존재하는 경우 기존 데이터를 지우기 위해서 사용합니다. sampleDB.execSQL("DELETE FROM " + tableName );
//새로운 데이터를 테이블에 집어넣습니다.. for (int i=0; i<names.length; i++ ) { sampleDB.execSQL("INSERT INTO " + tableName + " (name, phone) Values ('" + names[i] + "', '" + phones[i]+"');"); }
sampleDB.close();
} catch (SQLiteException se) { Toast.makeText(getApplicationContext(), se.getMessage(), Toast.LENGTH_LONG).show(); Log.e("", se.getMessage());
}
showList();
}
protected void showList(){
try {
SQLiteDatabase ReadDB = this.openOrCreateDatabase(dbName, MODE_PRIVATE, null);
//SELECT문을 사용하여 테이블에 있는 데이터를 가져옵니다.. Cursor c = ReadDB.rawQuery("SELECT * FROM " + tableName, null);
if (c != null) {
if (c.moveToFirst()) { do {
//테이블에서 두개의 컬럼값을 가져와서 String Name = c.getString(c.getColumnIndex("name")); String Phone = c.getString(c.getColumnIndex("phone"));
//HashMap에 넣습니다. HashMap<String,String> persons = new HashMap<String,String>();
persons.put(TAG_NAME,Name); persons.put(TAG_PHONE,Phone);
//ArrayList에 추가합니다.. personList.add(persons);
} while (c.moveToNext()); } }
ReadDB.close();
//새로운 apapter를 생성하여 데이터를 넣은 후.. adapter = new SimpleAdapter( this, personList, R.layout.list_item, new String[]{TAG_NAME,TAG_PHONE}, new int[]{ R.id.name, R.id.phone} );
//화면에 보여주기 위해 Listview에 연결합니다. list.setAdapter(adapter);
} catch (SQLiteException se) { Toast.makeText(getApplicationContext(), se.getMessage(), Toast.LENGTH_LONG).show(); Log.e("", se.getMessage()); }
}
} |
mainactivity.java에서
adapter = new SimpleAdapter(
this, personList, R.layout.list_item,
new String[]{TAG_NAME,TAG_PHONE},
new int[]{ R.id.name, R.id.phone}
에서 R이 빨간색으로 오류가 뜨고
private final String[] name = new String[]{"cupcake", "Donut", "Eclair", "Froyo",
"Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "Kitkat"};
에서 "cupcake","Donut"....등 " .." 안의 항목이 다 빨간줄로 오류나는 데 이유가뭘까요?
포스팅을 업데이트 했습니다. 다시 해보세요.
R오류 뜨는 것은 프로젝트가 잘못 생성되서 그럴 수 있습니다.
업데이트까지ㅜㅠㅠㅠ정말감사합니다ㅠㅠㅠㅠㅠㅠ sqlite위의예제처럼 사용해서 table 열항목을 두개 추가해 4개의 항목을 만든다음, 검색창기능으로 리스트의이름을 검색해서 나온 해당 항목을 클릭하면 새페이지로 넘어가 해당항목의 모든 table 내용이 화면에 뜨게하는 기능이 구현가능 할까요??... 복잡한 질문읽어주셔서감사합니다ㅠㅠ
죄송합니다..한가지만 더여쭤볼게요..
datebase 와 table 파일의 위치는 어디에 있을까요??
가능합니다. sql 파일 위치는 다음 링크를 참고하세요
https://stackoverflow.com/questions/4452538/location-of-sqlite-database-on-the-device
정말너무너무감사합니다ㅜㅜㅜㅜ 정말유용해요 혹시위 코드를 이용하여 리스트 항목 눌러서넘어간 새 페이지에서 테이블의 각 행의 항목들 정보를 가져오려면 cursor를 써야할까요??ㅜㅜ
인텐트(intent)를 사용하여 데이터를 전달해도 되지 않을까 싶습니다.
버튼 클릭시 리스트 뷰로 데이터를 보여주고 싶어 위 코드를 참고하여 만들었습니다.
그런데 클릭스 테이블을 찾을 수 없다는 문구가 뜹니다ㅜㅜ 테이블은 만들어진것 같은데 왜그런 건지 모르겠습니다
그 궁금한게 있는데 이 코드를 이용해서 다른 테이블에 적용하고 싶어서 phone이라는 변수 이름을 다른 변수 이름으로 수정하였는데 그 튜플값을 찾을 수 없다고 하는데 어케 해야 다른 변수를 사용할 수 있나요? mainactivity코드와 list_item 코드를 수정하였는데 작동을 안해서요 ㅠㅠ
에러메시지를 올려주세요
build시에 에러는 발생하지 않지만 앱을 실행하면
table address has no column named address(code 1);. while compling INSERT INTO rehobot(name,addres) values('rehobot', '경기도 용인시');
table명을 rehobot으로 바꾸고 안의 데이타들을 좀 바꾸었지만 phone을 그대로 적용하면 앱이 정상적으로 작동하는데 address로 phone의 변수를 다르게 적용하니 앱이 실행이 안됩니다 ㅠㅠ
build시엔 에러가 없으며 mainactivity에서의 phone부분을 모두 address로 수정하였고 list_item.xml파일에서 phone부분도 address로 다 수정하였습니다 그런데 변수만 바꾸었는데 왜 적용이 안되는지 궁금합니다.
테이블의 컬럼하고 sql문에서 사용한 컬럼이름이 달라서 생긴문제로 보이네요..
아 그러면 혹시 컬럼의 변수를 설정 혹은 더 추가 하려면activity_main과 list_item xml파일 수정 외에 또 다른 작업이 필요한 건가요?
sql에서 테이블 컬럼도 바꿔야합니다
다음 세군데에 있는 name과 phone을 똑같이 다른 문자열로 바꾸어주면 동작합니다.
테이블 생성하는 부분
sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName
+ " (name VARCHAR(20), phone VARCHAR(20) );");
테이블에 데이터 넣는 부분
for (int i=0; i<names.length; i++ ) {
sampleDB.execSQL("INSERT INTO " + tableName
+ " (name, phone) Values ('" + names[i] + "', '" + phones[i]+"');");
}
질의 결과에서 컬럼값 가져오는 부분
String Name = c.getString(c.getColumnIndex("name"));
String Phone = c.getString(c.getColumnIndex("phone"));
안녕하세요 항상 좋은 자료들 찾아보고있습니다.
질문이 있는데요
DB SELECT에서 조건으로 Cursor c = ReadDB.rawQuery("SELECT * FROM method where name = ?", new String[]{"%" + strSearch + "%"});
이러하게 부분적으로 조건을 검색하려고 하는데 구문오류라고 그러는데 이유를 알 수 있을까요? (결과가 null 값이기도 합니다.)
strSearch는 검색하는 EditText에서 가져온 문자열 입니다.
문자열을 조합한 결과를 따로 변수에 넣어서 제대로 조합되었는지 로그캣에 출력해본 후
rawQuery 함수에 대입하여 해보세요.