2017-09-18 2 views
0

Je crée une application qui insère des données dans la base de données. La table est créée mais rien n'est inséré dans la base de données et je n'obtiens aucune erreur. J'ai essayé de regarder les codes ligne par ligne, mais je ne peux rien déceler de faux. Lorsque je clique sur le bouton de sauvegarde, il se ferme de façon inattendue.Insertion de données dans la base de données dans SQLite à l'aide de getter et setter

méthode d'insertion dans la classe TreatmentRepo

 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 

} 

Ceci est ma méthode onclick

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)); 
} 
} 

Traitement

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; 
    } 
} 

fichier 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> 
+0

ajoutez votre logcat d'erreur –

+0

Il n'y a pas d'erreur dans le logcat – Omade

Répondre

1

Il nous manque quelques informations importantes pour vous aider à résoudre ce problème. Quelques choses qui seraient nécessaires pour aller au fond des choses sans deviner et vérifier.

  • Votre classe SQLiteOpenHelper et extrait de newing il à confirmer l'utilisation correcte du contexte
  • Votre instruction Create SQL pour garantir que ces types de données attendus correspondance int, String, int, String la façon dont vous insérez.
  • Est-ce que votre DB retour ouvert le db correctement
  • Votre première requête de sélection renvoyer un nombre correctement

Mais sans cette information, je dirais que vous pouvez essayer quelques choses. Vérifiez d'abord si l'insertion fonctionne avec des valeurs codées en dur pour éliminer le potentiel de mauvaises valeurs et éliminer le potentiel d'indisponibilité du DB en raison de la première requête. Donc, je voudrais commenter le rawQuery et le code dur d'une insertion, puis le code de la méthode différente d'un sélectionner tout pour voir si elle est entrée correctement.

En outre, vous n'utilisez pas votre ID principal d'insertion, pas sûr si cela était intentionnel ou non. Donc, le mieux que je peux faire pour vous maintenant, est de vous montrer un exemple de travail avec la gestion générique des tables et l'ouverture de SQL car je n'aime pas faire d'ouvreurs pour chaque projet alors je suis arrivé avec une librairie A35SQLUtil fait à cet effet. A35 étant mon abréviation personnelle d'entreprise App Studio 35.

N'hésitez pas à prendre l'un des exemples ci-dessous et courir avec eux, ou essayez et des idées ci-dessus pour dépanner ou fournir des informations supplémentaires. J'espère que cela a aidé.

Beaucoup de fois je vais faire un SQLOpenHelper singleton qui nécessite le contexte de l'appelant, puis un dataContext pour les éléments de table spécifiques et bien sûr un TableModel pour représenter les colonnes et les scripts SQL pour le gérer.Un insert ressemblerait à quelque chose comme:

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; 
} 

} }

Le SQLHelper ressemblerait à ceci:

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"); 
    } 
} 

}

Alors ma table modèle ressemblerait à ceci:

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(); 

} 

}

Enfin, je nouveau mon exemple génériquement dans le fichier d'application comme ceci:

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; 
} 

}

Alors pour la rigueur est ici l'interface

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

et à proximité util

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(); 
    } 

} 

}