2017-09-18 4 views
0

데이터를 데이터베이스에 삽입하는 응용 프로그램을 만들고 있습니다. 테이블이 생성되었지만 데이터베이스에 아무 것도 삽입되지 않아 오류가 발생하지 않습니다. 코드별로 한 줄씩 살펴 보려고했지만 잘못된 점은 발견 할 수 없습니다. 저장 버튼을 클릭하면 예기치 않게 닫힙니다. TreatmentRepo 클래스getter 및 setter를 사용하여 SQLite에서 데이터베이스에 데이터 삽입

 public void insert(Treatment treatment) { 

    //Open connection to write data 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    String query = "select * from Treatment"; 
    Cursor cursor = db.rawQuery(query, null); 

    int count = cursor.getCount(); 

    values.put(Treatment.KEY_TreatmentID, count); 
    values.put(Treatment.KEY_TreatmentNumber, treatment.getEditTextTreatmentNumber()); 
    values.put(Treatment.KEY_TreatmentType, treatment.getEditTextTreatmentType()); 
    values.put(Treatment.KEY_TreatmentName, treatment.getEditTextTreatmentName()); 

    db.insert(Treatment.TABLE, null, values); 
    db.close(); // Closing database connection 

} 

에서

삽입 방법이

public class Treatment { 


    // Labels table name 
    public static final String TABLE = "Treatment"; 

    // Labels Table Columns names 
    public static final String KEY_TreatmentID = "TreatmentId"; 
    public static final String KEY_TreatmentName = "TreatmentName"; 
    public static final String KEY_TreatmentType = "TreatmentType"; 
    public static final String KEY_TreatmentNumber = "TreatmentNumber"; 

    // property help us to keep data 
    public int treatment_ID; 
    public String editTextTreatmentName; 
    public String editTextTreatmentType; 
    public int editTextTreatmentNumber; 


    public int getEditTextTreatmentNumber() { 
     return editTextTreatmentNumber; 
    } 

    public void setEditTextTreatmentNumber(int editTextTreatmentNumber) { 
     this.editTextTreatmentNumber = editTextTreatmentNumber; 
    } 

    public String getEditTextTreatmentName() { 
     return editTextTreatmentName; 
    } 

    public void setEditTextTreatmentName(String editTextTreatmentName) { 
     this.editTextTreatmentName = editTextTreatmentName; 
    } 

    public String getEditTextTreatmentType() { 
     return editTextTreatmentType; 
    } 

    public void setEditTextTreatmentType(String editTextTreatmentType) { 
     this.editTextTreatmentType = editTextTreatmentType; 
    } 
} 

XML 파일

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="368dp" 
     android:layout_height="495dp" 
     tools:context="com.instinctcoder.sqlitedb.StudentDetail$PlaceholderFragment" 
     tools:layout_editor_absoluteY="8dp" 
     tools:layout_editor_absoluteX="8dp"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Treatment Name" 
      android:id="@+id/treatmentName" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="30dp" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Treatment Type" 
      android:id="@+id/treatmentType" 
      android:layout_below="@+id/treatmentName" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="29dp" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Treatment Number" 
      android:id="@+id/treatmentNumber" 
      android:layout_below="@+id/treatmentType" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="29dp" /> 

     <EditText 
      android:id="@+id/editTextTreatmentName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/treatmentType" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_toRightOf="@+id/treatmentName" 
      android:ems="10" 
      android:inputType="textShortMessage" /> 

     <EditText 
      android:id="@+id/editTextTreatmentType" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/treatmentNumber" 
      android:layout_alignEnd="@+id/editTextTreatmentName" 
      android:layout_alignRight="@+id/editTextTreatmentName" 
      android:layout_toRightOf="@+id/treatmentName" 
      android:ems="10" 
      android:inputType="textShortMessage" /> 

     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:inputType="number" 
      android:ems="10" 
      android:id="@+id/editTextTreatmentNumber" 
      android:layout_alignBottom="@+id/treatmentNumber" 
      android:layout_alignLeft="@+id/editTextTreatmentType" 
      android:layout_alignStart="@+id/editTextTreatmentType" 
      android:layout_alignRight="@+id/editTextTreatmentType" 
      android:layout_alignEnd="@+id/editTextTreatmentType" /> 

     <Button 
      android:id="@+id/btnSave" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:onClick="onClick" 
      android:layout_toLeftOf="@+id/btnClose" 
      android:text="Save" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Close" 
      android:id="@+id/btnClose" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentEnd="true" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Delete" 
      android:id="@+id/btnDelete" 
      android:layout_alignTop="@+id/btnSave" 
      android:layout_toLeftOf="@+id/btnSave" /> 

    </RelativeLayout> 
치료

내 온 클릭 방법

public void onClick(View v) { 
    if (v.getId() == R.id.btnSave) { 
     TreatmentRepo repo = new TreatmentRepo(this); 


     editTextTreatmentName = (EditText) findViewById(R.id.editTextTreatmentName); 
     editTextTreatmentType = (EditText) findViewById(R.id.editTextTreatmentType); 
     editTextTreatmentNumber = (EditText) findViewById(R.id.editTextTreatmentNumber); 
     btnSave = (Button) findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(this); 

     int treatmentNumber = Integer.parseInt(editTextTreatmentNumber.getText().toString()); 
     String treatmentType = editTextTreatmentType.getText().toString(); 
     String treatmentName = editTextTreatmentName.getText().toString(); 

     Treatment treatment = new Treatment(); 
     treatment.setEditTextTreatmentNumber(treatmentNumber); 
     treatment.setEditTextTreatmentName(treatmentName); 
     treatment.setEditTextTreatmentType(treatmentType); 

     repo.insert(treatment); 

     Toast.makeText(this, "New Treatment Insert", Toast.LENGTH_SHORT).show(); 
     startActivity(new Intent(this, view_treatment_entry.class)); 
} 
} 

입니다

+0

logcat 오류를 –

+0

에 추가하십시오. logcat에 오류가 없습니다. – Omade

답변

1

문제를 해결하는 데 도움이되는 몇 가지 중요한 정보가 누락되었습니다. 추측하고 확인하지 않고이 바닥에 도달하는 데 필요한 몇 가지 사항.

  • 귀하의 SQLiteOpenHelper 클래스와 newing의 조각 그것까지 확인하는 적절한 상황에 사용
  • 귀하의 데이터 유형이 일치 INT, 문자열, INT 예상 수 있도록 SQL 문을 작성, 문자열 삽입하는 방법입니다.
  • 귀하의 첫 번째 선택 쿼리 수를 반환 않습니다 DB 개방 반환 DB를 제대로
  • 합니까 제대로

하지만 난 당신이 몇 가지를 시도해 볼 수도 말할 것 그 정보를 필요없이. 먼저 삽입이 하드 코드 된 값으로 작동하여 잘못된 값의 가능성을 제거하고 첫 번째 쿼리로 인해 DB를 사용할 수 없게 될 가능성을 제거하십시오. 그래서 rawQuery를 주석 처리하고 삽입 코드를 하드 코딩 한 다음 다른 메소드가 제대로 선택되면 모두 선택 코드를 표시합니다.

또한 삽입 기본 ID가 의도적인지 여부와는 관계 없습니다.

그래서 지금 당장 당신을 위해 할 수있는 일은 테이블과 SQL 열기의 일반적인 관리를 보여주는 예제입니다. 각 프로젝트마다 오프너를 만들고 싶지 않으므로 A35SQLUtil 라이브러리를 생각해 냈습니다. 이 목적으로 만들어졌습니다. A35는 개인 회사 약자 인 App Studio 35입니다.

다음 예제 중 하나를 선택하여 실행하거나 위의 아이디어로 문제를 해결하거나 추가 정보를 제공하십시오. 희망이 도움이되었습니다.

많은 경우, 호출자의 컨텍스트와 특정 테이블 요소에 대한 dataContext를 필요로하는 싱글 톤 SQLOpenHelper를 만들고 테이블 모델을 관리하기위한 열과 SQL 스크립트를 나타내는 TableModel을 만들 것입니다.삽입은 같은 보일 것이다 :

public class OrderDataContext { 

/*/////////////////////////////////////////////////////////////// 
// MEMBERS 
*//////////////////////////////////////////////////////////////// 
private static final String TAG = Globals.SEARCH_STRING + OrderDataContext.class.getSimpleName(); 


/*/////////////////////////////////////////////////////////////// 
// CONSTRUCTOR 
*//////////////////////////////////////////////////////////////// 
private OrderDataContext(){} 


/*/////////////////////////////////////////////////////////////// 
// CRUD OPERATIONS 
*//////////////////////////////////////////////////////////////// 
public static long insertNewOrder(OrderModel model, Context context){ 
    long primaryKey = -1; 
    SQLiteDatabase db = null; 

    try{ 
     db = A35DBHelper.openDatabase(context); 
     ContentValues initialValues = new ContentValues(); 

     initialValues.put(OrdersTable.COLUMN_ORDER_NUMBER, model.getID()); 
     initialValues.put(OrdersTable.COLUMN_VIN, model.getVIN()); 
     initialValues.put(OrdersTable.COLUMN_CREATED_AT_DATE, model.getCreatedAtDate()); 
     initialValues.put(OrdersTable.COLUMN_IMAGE_COUNT, model.getImageCount()); 
     initialValues.put(OrdersTable.COLUMN_DEFAULT_THUMBNAIL_URL, model.getDefaultThumbnailUrl()); 

     primaryKey = db.insert(OrdersTable.TABLE_NAME, null, initialValues); 

    } catch (Exception ex) { 
     A35Log.e(TAG, "Failed to insert order: " + ex.getMessage()); 

    } 

    A35DBHelper.closeDatabase(db); 
    return primaryKey; 
} 

} 을}

것처럼 SQLHelper가 보일 것이다

:

public final class A35DBHelper extends SQLiteOpenHelper { 
private static final String TAG = A35DBHelper.class.getSimpleName(); 
private static int sDatabaseVersion; 
private static String sDatabaseName = null; 
private static List<Class<? extends IA35Table>> sTables; 

private A35DBHelper(Context context) { 
    super(context.getApplicationContext(), sDatabaseName, (CursorFactory)null, sDatabaseVersion); 
} 

public static void initialize(String databaseName, int databaseVersion, Class<? extends IA35Table> table) { 
    ArrayList tables = new ArrayList(); 
    tables.add(table); 
    initialize(databaseName, databaseVersion, (List)tables); 
} 

public static void initialize(String databaseName, int databaseVersion, List<Class<? extends IA35Table>> tables) { 
    sDatabaseName = databaseName; 
    sDatabaseVersion = databaseVersion; 
    sTables = tables; 
} 

public void onCreate(SQLiteDatabase sqLiteDatabase) { 
    Iterator i = sTables.iterator(); 

    while(i.hasNext()) { 
     Class table = (Class)i.next(); 

     try { 
      sqLiteDatabase.execSQL(((IA35Table)table.newInstance()).getCreateTableScript()); 
     } catch (Exception var5) { 
      Log.e(TAG, var5.getMessage()); 
     } 
    } 

} 

public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
    Iterator i = sTables.iterator(); 

    while(i.hasNext()) { 
     Class table = (Class)i.next(); 

     try { 
      sqLiteDatabase.execSQL(((IA35Table)table.newInstance()).getUpgradeTableScript()); 
     } catch (Exception var7) { 
      Log.e(TAG, var7.getMessage()); 
     } 
    } 

} 

public static SQLiteDatabase openDatabase(Context context) throws Exception { 
    return getA35DBHelper(context).getWritableDatabase(); 
} 

public static void closeDatabase(SQLiteDatabase db) { 
    CloseableUtil.close(TAG, db); 
} 

public static Cursor executeSelectQueryForCursor(Context context, String sqlScript) throws Exception { 
    SQLiteDatabase readableDatabase = getA35DBHelper(context).getReadableDatabase(); 
    Cursor cursor = readableDatabase.rawQuery(sqlScript, (String[])null); 
    return cursor; 
} 

public static void executeWriteQuery(Context context, String sqlScript) throws Exception { 
    SQLiteDatabase writeSqLiteDatabase = getA35DBHelper(context).getWritableDatabase(); 
    writeSqLiteDatabase.execSQL(sqlScript); 
    CloseableUtil.close(TAG, writeSqLiteDatabase); 
} 

public static void closeCursor(String tag, Closeable closeable) { 
    CloseableUtil.close(tag, closeable); 
} 

private static A35DBHelper getA35DBHelper(Context context) throws Exception { 
    try { 
     return new A35DBHelper(context); 
    } catch (Exception var2) { 
     throw new Exception("MUST call A35DBHelper.initialize before using the helper methods"); 
    } 
} 

}

그런 다음 내 테이블 모델의 모습

public class OrdersTable implements IA35Table { 

/*/////////////////////////////////////////////////////////////// 
// MEMBERS 
*//////////////////////////////////////////////////////////////// 
private static final String TAG = Globals.SEARCH_STRING + OrdersTable.class.getSimpleName(); 
public static final String TABLE_NAME = "ordersTable"; 
public static final String COLUMN_PRIMARY_ID = "_id"; 
public static final String COLUMN_ORDER_NUMBER = "orderNumber"; 
public static final String COLUMN_VIN = "vin"; 
public static final String COLUMN_CREATED_AT_DATE = "createdAtDate"; 
public static final String COLUMN_IMAGE_COUNT = "imageCount"; 
public static final String COLUMN_DEFAULT_THUMBNAIL_URL = "defaultThumbnailUrl"; 
public static String columns[] = { 
     OrdersTable.COLUMN_PRIMARY_ID, 
     OrdersTable.COLUMN_REPAIR_ORDER_NUMBER, 
     OrdersTable.COLUMN_CREATED_AT_DATE 
}; 


/*/////////////////////////////////////////////////////////////// 
// IA35TABLE OVERRIDES 
*//////////////////////////////////////////////////////////////// 
@Override 
public String getCreateTableScript() { 
    A35SQLHelper.CreateTableStatement createTableStatement = new A35SQLHelper.CreateTableStatement(TABLE_NAME); 

    createTableStatement.addColumnAsIntPrimaryKey(COLUMN_PRIMARY_ID); 
    createTableStatement.addColumn(A35SQLHelper.ColumnType.TEXT, COLUMN_REPAIR_ORDER_NUMBER, false, null); 
    createTableStatement.addColumn(A35SQLHelper.ColumnType.TEXT, COLUMN_VIN, false, null); 
    createTableStatement.addColumn(A35SQLHelper.ColumnType.TEXT, COLUMN_CREATED_AT_DATE, false, null); 
    createTableStatement.addColumn(A35SQLHelper.ColumnType.INTEGER, COLUMN_IMAGE_COUNT, false, null); 
    createTableStatement.addColumn(A35SQLHelper.ColumnType.TEXT, COLUMN_DEFAULT_THUMBNAIL_URL, false, null); 

    String createTableScript = createTableStatement.generateSQL(); 
    A35Log.d(TAG, "Creating " + TABLE_NAME + " Table. Query: " + createTableScript); 

    return createTableScript; 

} 
@Override 
public String getUpgradeTableScript() { 
    //Currently, I am dropping date and create the table again. But If required in future, 
    //I will need to handle the data migration operations. 
    StringBuilder sb = new StringBuilder(); 

    sb.append("DROP TABLE IF EXISTS " + TABLE_NAME + "; "); 
    sb.append(getCreateTableScript()); 
    A35Log.d(TAG, "Dropping " + TABLE_NAME + " Table. Query: " + sb.toString()); 

    return sb.toString(); 

} 
,210

}

마지막으로, 정말 같은 응용 프로그램 파일에 일반적으로 내 인스턴스를 새로운 :

public class A35Application extends Application { 

/*/////////////////////////////////////////////////////////////// 
// MEMBERS 
*//////////////////////////////////////////////////////////////// 
private final static String TAG = Globals.SEARCH_STRING + A35Application.class.getSimpleName(); 
private static final String A35_ORDER_DB_NAME = "a35_orders_db"; 
private static final int DB_VERSION = 1; 


/*/////////////////////////////////////////////////////////////// 
// LIFECYCLE OVERRIDES 
*//////////////////////////////////////////////////////////////// 
@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.v(TAG, "onCreate()"); 
    setup(); 

} 


/*////////////////////////////////////////////////////////// 
// PUBLIC METHODS 
*/////////////////////////////////////////////////////////// 
public void setup() { 
    A35Log.v(TAG, "setup()"); 
    setCurrentEnvironment(A35Environment.Env.PRD); 
    setupCustomFonts(); 
    **setupDatabase();** 
    setupLogging(); 
    startAnalyticsReporting(); 
    if(!BuildConfig.DEBUG) { 
     startCrashReporting(); 

    } 

} 


/*/////////////////////////////////////////////////////////////// 
// PRIVATE METHODS 
*//////////////////////////////////////////////////////////////// 
private void setupDatabase(){ 
    A35Log.v(TAG, "setupDatabase()"); 
    A35DBHelper.initialize(A35_ORDERS_DB_NAME, DB_VERSION, getDBTables()); 

} 
private ArrayList<Class<? extends IA35Table>> getDBTables() { 
    ArrayList<Class<? extends IA35Table>> tables = new ArrayList<>(); 

    tables.add(SessionTable.class); 
    tables.add(ServicesTable.class); 
    tables.add(OrdersTable.class); 
    tables.add(ImagesToUploadTable.class); 
    tables.add(VideosToUploadTable.class); 
    tables.add(AudiosToUploadTable.class); 

    return tables; 
} 

} 여기에 철저를 위해 그

인터페이스

public interface IA35Table { 
String getCreateTableScript(); 
String getUpgradeTableScript(); 
} 

과 가깝습니다 유틸리티

public class CloseableUtil { 
public CloseableUtil() { 
} 

public static void close(@NonNull String tag, @Nullable Closeable closeable) { 
    if(closeable != null) { 
     try { 
      closeable.close(); 
     } catch (IOException var3) { 
      Log.e(tag, "Unable to close: " + closeable, var3); 
     } 
    } 

} 

public static void closeWithThrowIOException(@Nullable Closeable closeable) throws IOException { 
    if(closeable != null) { 
     closeable.close(); 
    } 

} 

}

관련 문제