2017-12-09 4 views
0

열 이름을 키로 사용하여 행을 읽으려고하지만 어떻게 든 가져올 수 없습니다.SQLite 데이터베이스에서 데이터를 읽으려면 어떻게해야합니까?

예 나는

여기 내 삽입 코드

public void insertStudent(String name, int faculty){ 
     ContentValues cv = new ContentValues(); 
     cv.put("name", name); 
     cv.put("faculty", faculty); 
     mSqliteDatabase.insert("students", null, cv); 
    } 

입니다 그리고 여기가 데이터를 조회하는 방법은 ListView에있는 문자열 "이름"

목록이 그냥 "1"이 표시를 입력 :

public List<String> selectAllEngg(){ 
     List<String> allStudents = new ArrayList<>(); 
     Cursor cursor = mSqliteDatabase.query("students", new String[]{"faculty"}, null, null, null, null, null); 
     if(cursor != null && cursor.moveToFirst()){ 
      do { 

       allStudents.add(cursor.getString(0)); 
      } while (cursor.moveToNext()); 
     } 
     return allStudents; 
    } 

package test; 
 

 
import android.content.ContentValues; 
 
import android.content.Context; 
 
import android.database.Cursor; 
 
import android.database.sqlite.SQLiteDatabase; 
 
import android.database.sqlite.SQLiteOpenHelper; 
 

 
import java.util.ArrayList; 
 
import java.util.List; 
 

 
public class MyDBAdapter { 
 
    public static final String DATABASE_NAME = "data"; 
 

 
    private Context mContext; 
 
    private MyDBHelper mDbHelper; 
 
    private SQLiteDatabase mSqliteDatabase; 
 
    private int DATABASE_VERSION = 1; 
 

 
    public MyDBAdapter(Context context){ 
 
     this.mContext = context; 
 
     mDbHelper = new MyDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION); 
 
    } 
 

 
    public void open(){ 
 
     mSqliteDatabase = mDbHelper.getWritableDatabase(); 
 
    } 
 

 
    public class MyDBHelper extends SQLiteOpenHelper{ 
 
     public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){ 
 
      super(context, name, factory, version); 
 
     } 
 

 
     @Override 
 
     public void onCreate(SQLiteDatabase db){ 
 
      String query = "CREATE TABLE students(id integer primary key autoincrement, name text, faculty integer);"; 
 
      db.execSQL(query); 
 
     } 
 

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

 
    public void insertStudent(String name, int faculty){ 
 
     ContentValues cv = new ContentValues(); 
 
     cv.put("name", name); 
 
     cv.put("faculty", faculty); 
 
     mSqliteDatabase.insert("students", null, cv); 
 
    } 
 

 
// public List<String> selectAllStudents(){ 
 
//  List<String> allStudents = new ArrayList<>(); 
 
//  Cursor cursor = mSqliteDatabase.query("students", null, null, null, null, null, null); 
 
//  if(cursor != null && cursor.moveToFirst()){ 
 
//   do { 
 
//    allStudents.add(cursor.getString(1)); 
 
//   } while (cursor.moveToNext()); 
 
//  } 
 
//  return allStudents; 
 
// } 
 

 
    public List<String> selectAllEngg(){ 
 
     List<String> allStudents = new ArrayList<>(); 
 

 
     Cursor cursor = mSqliteDatabase.query("students", new String[]{"faculty"}, null, null, null, null, null); 
 
     if(cursor != null && cursor.moveToFirst()){ 
 
      do { 
 
       if(cursor.getString(cursor.getColumnIndex("faculty")).equals("1")){ 
 
        allStudents.add(cursor.getString(cursor.getColumnIndex("name"))); 
 
       } 
 
//    allStudents.add(cursor.getString(0)); 
 

 
      } while (cursor.moveToNext()); 
 
     } 
 
     return allStudents; 
 
    } 
 

 
    public void deleteAllEngineers(){ 
 
     mSqliteDatabase.delete("students", null, null); 
 
    } 
 
}

DB 자바 파일을 추가했습니다.

+0

[안드로이드에서 sqlite 데이터베이스의 데이터를 검색하여 TextView에 표시하는 방법] (https://stackoverflow.com/questions/12298835/how-to-retrieve-data-from-sqlite-database-in) - android-and-display-it-in-textview) – imGs

답변

0

cursor.getString(0)을 사용하는 것은 (IMO) 나쁜 습관입니다. 즉, 실제로 열 인덱스를 알고 가정, 당신은 매우 쉽게 찾을 수 있지만,이 일을 더 나은 :

allStudents.add(cursor.getString(cursor.getColumnIndex("name"))); 

바람직 정적 상수 것처럼 열 이름을 선언하지만,이 여전히 당신이 이름을 적어 가정 작동 권리.

0의 열이 이름 열을 가리키지 않아 "1"이 출력으로 표시되는 이유 때문일 가능성이 큽니다.

+0

좋아요 어떻게 작동합니까? 사용자가 이름을 입력하고 자신이 교수진을 선택할 수있는 EditText가 있습니다 (Engineering, Business, 및 예술). DB에 infos를 저장하는 버튼이 있습니다. 대학별 이름 목록을 얻으려고합니다. 어떻게 알아낼 수 없습니까? 어떤 아이디어? – Mark

2

cursor.getString (0)에서 0을 사용하면 쿼리에 테이블 사양에 따라 하나의 "faculty"열만 포함되므로 1을 반환합니다. 그러나 Zoe와는 나쁜 관행이며 코드를 유지 관리하고 디버깅하기가 어렵다는 데 동의합니다.

String[] columns = {"name","faculty"}; 
Cursor cursor = mSqliteDatabase.query("students", columns, null, null, null, null, null); 

또는 방법 :

당신이 두 쿼리의 열 배열의 문자열에, 나는이 방법을 추천 포함 할 필요가 이름과 교수와 질의 (더 읽을 수있는 코드)를 가지고하기 위해

당신은 예를 들어지도에 (키와 값을 수락 모음) ArrayList의 변경 또는 클래스로 테이블 열을 구현하고 그 클래스 타입의 ArrayList를 사용하거나 목록을 만들 필요가 이런 식으로

Cursor cursor = mSqliteDatabase.query("students", new String[] {"name","faculty"}, null, null, null, null, null); 

같은 문자열 배열 형식 :

ArrayList<String[]> allStudents = new ArrayList(); 
allStudents.add(new String[] {"put here faculty integer","put here student name"}); 

희망이 도움이 될 수 있습니다.

관련 문제