엑티비티 실행이 안됩니다(안드로이드, 데이터베이스)(초보)

조회수 1276회

public class DBHelperForSearched extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "searched";
public static final String TABLE_NAME = "searched_table";
public static final String COL1 = "ID";
public static final String COL2 = "ITEM1";
public static final String COL3 = "ITEM2";


DBAdapterForSearched dbAdapter;
Cursor cursor;
ListView list;

public DBHelperForSearched(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + "(ITEM1 TEXT primary key," + " ITEM2 TEXT)";
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertDataToSearched(String item1, String item2) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item1);
    contentValues.put(COL3, item2);

    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

public Cursor getListContents(){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    return data;
}

}

db헬퍼 코드입니다. 한 영역을 primary key로 정해 db에 중복된 primary key값 없이 저장하는 액티비티를 만들고 있는데, 어째서인지 해당 액티비티의 실행이 계속 중지가 됩니다. 무엇이 문제인지를 잘 모르겠습니다. 조언 부탁드립니다.

아래로는 위 db를 활용하는 액티비티입니다.

--------------------------------------------------조언해주신대로 수정했습니다-----------------------------------------------

public class Searched extends AppCompatActivity {

static String DATABASE_NAME;
static String TABLE_NAME;
static int DATABASE_VERSION;
private static final String TAG = "TestDataBaseActivity";
private DBHelperForSearched db;
ListView list;
public String data_city, data_country;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.searched_list);


    db = new DBHelperForSearched(this);


    list = (ListView) findViewById(R.id.searched_list);
    db.getListContents();

    final ArrayList<InfoClassForSearched> weatherList = new ArrayList<InfoClassForSearched>();
    Cursor data = db.getListContents();

    if (data.getCount() == 0) {
        Toast.makeText(this, "There are no contents in this list!", Toast.LENGTH_LONG).show();
    } else {
        while (data.moveToNext()) {
            InfoClassForSearched newInfo = new InfoClassForSearched(data.getString(0), data.getString(1));
            weatherList.add(newInfo);
            DBAdapterForSearched dbAdapter = new DBAdapterForSearched(this, weatherList);
            list.setAdapter(dbAdapter);
        }
    }


    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            InfoClassForSearched selectedInfoClass = weatherList.get(position);
            data_city = selectedInfoClass.getCity();
            data_country = selectedInfoClass.getCountry();

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

            intent.putExtra("data_city", data_city);
            intent.putExtra("data_country", data_country);


            setResult(Activity.RESULT_OK, intent);
            finish();

        }
    });
}

}

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 에러로그를 보여주세요 주동혁 2018.4.26 15:03
  • 에러가 뭔지 나오지를 않으며 그저 어플리케이션이 강제로 종료되었다로만 나왔습니다... 알 수 없는 사용자 2018.4.26 15:45
  • 에러로그가 없다구요? 주동혁 2018.4.26 15:53
  • 2018-04-26 오후 4:23 Executing tasks: [:app:assembleDebug] 오후 4:23 Gradle build finished in 11s 160ms 오후 4:24 Executing tasks: [:app:assembleDebug] 오후 4:24 Gradle build finished in 1s 146ms 알 수 없는 사용자 2018.4.26 16:26
  • 로그가 이것 이외에는 나오지를 않네요.... 알 수 없는 사용자 2018.4.26 16:26
  • Event Log 말고 Logcat 쪽을 보세요 주동혁 2018.4.26 16:28
  • 앗 넵 알 수 없는 사용자 2018.4.26 16:31
  • Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 2 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 알 수 없는 사용자 2018.4.26 16:31
  • 이라고 나옵니다 알 수 없는 사용자 2018.4.26 16:31

1 답변

  • data.getString(1), data.getString(2)를 data.getString(0), data.getString(1)로 수정해보세요

    sqlite 테이블에는 item1, item2 column만 존재하는데 column index 2에 접근하려고 하니까 에러가 나는 것 같습니다.

    ----- 추가 -------

    String createTable = "CREATE TABLE " + TABLE_NAME + "(ITEM1 TEXT primary key," + " ITEM2 TEXT)";

    여기에서 "(ITEM1 .... 이 부분을

    " (ITEM1... 이렇게 쌍따옴표 뒤에 한 칸 스페이스 공백을 주고 실행해보세요.

    • 그 부분을 수정했더니 다른 오류가 하나가 더 나왔습니다 알 수 없는 사용자 2018.4.26 16:42
    • E/SQLiteDatabase: Error inserting ITEM2=KR ITEM1=Seoul 알 수 없는 사용자 2018.4.26 16:43
    • 위의 에러가 하나 더 발견되었는데 insert에서 어떤 부분이 문제가 있는 걸까요...? 알 수 없는 사용자 2018.4.26 16:43
    • insert하는 부분의 코드 첨부해주시면 감사하겠습니다. 주동혁 2018.4.26 16:47
    • 위에 있는 코드에서 insertDataToSearched 메소드로 db에 데이터를 넣고 있습니다 알 수 없는 사용자 2018.4.26 16:56
    • 답변 추가 했습니다. 확인해주세요. 주동혁 2018.4.26 16:58
    • insert의 문제는 distinct db를 위해 겹치는 primary key를 받아들이지 않는 것으로 판명났습니다. 알 수 없는 사용자 2018.4.26 17:04
    • 아래쪽 코드에서 읽어오는 것에 문제가 있는 것 같습니다.... 알 수 없는 사용자 2018.4.26 17:05
    • 잘 처리되었습니다. 감사합니다 알 수 없는 사용자 2018.4.27 13:12
    • 해결하셨다니 다행이네요. 주동혁 2018.4.27 13:51

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)