마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SQLite 질문 드립니다!! [closed]

0 추천

String query = "SELECT * FROM " + CHAT + " WHERE " + CHAT_NAME +" = '" + room_name + "'";

이렇게 하면 저장이 안되서 cursor.moveToFirst에 false 가 되는데

String query = "SELECT * FROM " + CHAT + " '" + room_name + "'"; 이렇게 하면 정상적으로 저장되어 출력이 되거든요??

이유가 무엇일까요?

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

 public DBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
    {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        String CREATE_CHAT_TABLE =

                "CREATE TABLE " +

                        CHAT + "(" + CHAT_LIST + " INTEGER PRIMARY KEY," +

                        CHAT_NAME + " TEXT," +

                        CHAT_TEXT + " TEXT" + ")";

        db.execSQL(CREATE_CHAT_TABLE);
    }

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

    public ArrayList<String> findProduct(String room_name)
    {
        Log.i("findProduct", String.valueOf(room_name));

        String query = "SELECT * FROM " + CHAT + " WHERE " + CHAT_NAME +" = '" + room_name + "'"; < -- 문제

        arrayList = new ArrayList<>();

        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();

        Cursor cursor = sqLiteDatabase.rawQuery(query, null);

        Log.i("Cursor", DatabaseUtils.dumpCursorToString(cursor));

        if(cursor.moveToFirst())
        {
            cursor.moveToFirst();

            int count = cursor.getCount();

            Log.i("count", String.valueOf(count));

            for(int i = 0; i < count; i++)
            {
                Log.i("cursor", "Start");

                String name = cursor.getString(cursor.getColumnIndex("name"));

                arrayList.add(name);

                cursor.moveToNext();
            }

            cursor.close();
        }
        else
        {
            Log.i("Select", "Error");
        }

        sqLiteDatabase.close();

        return arrayList;
    }

    public void addProduct(List_Data list_data)
    {
        ContentValues contentValues = new ContentValues();

        contentValues.put(CHAT_NAME, list_data.setRoomName());

        Log.i("addProduct", String.valueOf(list_data.setRoomName()));

        SQLiteDatabase sqLiteDatabase =this.getWritableDatabase();

        sqLiteDatabase.insert(CHAT, null, contentValues);
        sqLiteDatabase.close();
    }

 

답변 부탁드립니다!

 

// DB 생성시 필드 값을 TEXT NOT NULL로 해주니 

 

 E/SQLiteLog: (1299) abort at 6 in [INSERT INTO chat(name) VALUES (?)]: NOT NULL constraint failed: chat.text 이런 에러가 발생했습니다. 그럼 그전 까지는 NULL 값이 들어갔다는 것인데 흠;;

질문을 종료한 이유: ...
알파고 (4,320 포인트) 님이 2017년 11월 19일 질문
알파고님이 2017년 11월 21일 closed

1개의 답변

–1 추천
  1. 처음 쿼리는 where 로 특정 데이터 에 해당하는 것을 요청하는것이고 두번째는 전체를 요청하는것이니 다르겠죠..
  2. moveToFirst 가 중복 선언되어 있는 부분이 있군요 
  3. insert 부분에 왜 list 를 set 하나요? 디비에 저장하는게 아니고 list 에 저장을 하려는건가요?

 

aucd29 (218,390 포인트) 님이 2017년 11월 20일 답변
moveToFirst가 두 번 정의되는 이유는 저도 잘모르겠습니다. 책에 그렇게 되있습니다.

Insert 부분이라면 addProduct 말씀이신가요?
List_Data는 데이터를 받아오는 클래스 입니다.

Select 부분에서 db에 저장된 데이터를 arraylist로 받고있습니다.
1. 책이 잘못되어 있네요

2. list_data 에 데이터를 contentValues 에 put 해야 하는데 왜  list_data 에 getRoomName 이 아닌 setRoomName 인가요

2번도 책이 그렇게 되어 있으면 그 책은 안보시는게 나아보입니다. -_ -
그 setRoomName은 list_data 클래스에 메소드이고 호출하게되면 return 으로 데이터를 되돌려받고있습니다.

밑에 log 보면 데이터가 들어온것이 확인되거든요.

근데

지금 왜 안되는지 기능적인 거만 본다면 어디가 문제일까요?
set 인데 return 하는것도 문제니 수정하시구요

https://www.journaldev.com/9438/android-sqlite-database-example-tutorial
여길 참조하세요
...