2017-10-17 7 views
-1

Je suis en train de développer une petite application qui a une valeur dans un textview défini à 150 000 par défaut. Chaque mois, je réinitialise la valeur par défaut. Chaque fois que je dépense une partie de ce montant, j'ouvre mon application et saisis le montant que j'ai dépensé et les détails de ce qui a été dépensé. Ce que j'ai fait était de créer une base de données hors ligne pour stocker toutes les fois où j'ai dépensé une partie de ce montant, avec son identifiant et ses détails. Chaque fois que j'appuie sur le bouton "dépenser", le montant total est réduit du montant que j'ai saisi dans l'EditText.Mise à jour d'une certaine valeur et enregistrement dans une base de données hors ligne

Je n'ai pas mis en œuvre comment je vais mettre à jour le montant total encore, je crois que je dois utiliser quelque chose appelé numéro de préférence partagée.

Ceci est l'activité principale:

public class MainActivity extends AppCompatActivity { 

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

    Button spendMoney = (Button)this.findViewById(R.id.spendMoney); 
    Button test = (Button)this.findViewById(R.id.test); 
    TextView totalTxt = (TextView) this.findViewById(R.id.totalTxt); 
    final EditText spendAmount = (EditText)this.findViewById(R.id.spendAmount); 

    // int totalAmount = Integer.parseInt(totalTxt.getText().toString()); 

    final Paid_DB db = new Paid_DB(this); 



    spendMoney.setOnClickListener(new View.OnClickListener() { 

     @Override 

     public void onClick(View v) { 
      db.addPayment(new Payment(0, (Integer.parseInt(spendAmount.getText().toString())), "Test Details")); 

     } 

    }); 

    //totalAmount = totalAmount - Integer.parseInt(spendAmount.getText().toString()); 
    // totalTxt.setText(totalAmount); 
    test.setOnClickListener(new View.OnClickListener() { 

     @Override 

     public void onClick(View v) { 
      Intent i = new Intent(null, DetailsActivity.class); 
      startActivity(i); 
     } 

    }); 

fichier XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.user.paid.MainActivity"> 

<TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="13dp" 
    android:layout_marginStart="13dp" 
    android:layout_marginTop="53dp" 
    android:fontFamily="sans-serif" 
    android:text="Total:" 
    android:textSize="30sp" 
    tools:layout_editor_absoluteX="25dp" 
    tools:layout_editor_absoluteY="36dp" /> 

<EditText 
    android:id="@+id/spendAmount" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="number" 
    tools:layout_editor_absoluteX="72dp" 
    tools:layout_editor_absoluteY="143dp" 
    android:layout_marginBottom="38dp" 
    android:layout_above="@+id/spendMoney" 
    android:layout_centerHorizontal="true" /> 

<Button 
    android:id="@+id/spendMoney" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Spend Money" 
    tools:layout_editor_absoluteX="115dp" 
    tools:layout_editor_absoluteY="215dp" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:id="@+id/totalTxt" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/textView3" 
    android:layout_alignBottom="@+id/textView3" 
    android:layout_alignEnd="@+id/spendMoney" 
    android:layout_alignRight="@+id/spendMoney" 
    android:fontFamily="sans-serif" 
    android:text="150,000" 
    android:textSize="30sp" 
    tools:layout_editor_absoluteX="25dp" 
    tools:layout_editor_absoluteY="36dp" /> 

<Button 
    android:id="@+id/test" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Test" 
    tools:layout_editor_absoluteX="134dp" 
    tools:layout_editor_absoluteY="358dp" 
    android:layout_marginBottom="90dp" 
    android:layout_alignParentBottom="true" 
    android:layout_alignLeft="@+id/spendMoney" 
    android:layout_alignStart="@+id/spendMoney" /> 

Ceci est l'objet que je rentre dans la base de données en ligne, contenant l'identifiant, le montant dépensé, et les détails du paiement:

public class Payment { 


private int id; 
private int amount; 
private String details; 


public Payment(){} 

public Payment(int id, int amount, String details) { 
    this.id = id; 
    this.amount = amount; 
    this.details = details; 
} 

public Payment(int id, int amount) { 
    this.id = id; 
    this.amount = amount; 
} 

public Payment(int amount, String details) { 
    this.amount = amount; 
    this.details = details; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public int getAmount() { 
    return amount; 
} 

public void setAmount(int amount) { 
    this.amount = amount; 
} 

public String getDetails() { 
    return details; 
} 

public void setDetails(String details) { 
    this.details = details; 
} } 

C'est la base de données en ligne:

ublic class Paid_DB extends SQLiteOpenHelper { 

// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "Payments_DB"; 

// Contacts table name 
private static final String PAYMENT_TABLE = "PaymentTable"; 

// Contacts Table Columns names 
private static final String PAY_ID = "id"; 
private static final String PAY_AMOUNT = "amount"; 
private static final String PAY_DETAILS = "details"; 

Paid_DB(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + PAYMENT_TABLE + "(" 
      + PAY_ID + " INTEGER PRIMARY KEY," + PAY_AMOUNT + " INTEGER," 
      + PAY_DETAILS + " TEXT" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS " + PAYMENT_TABLE); 

    onCreate(db); 
} 

public void addPayment(Payment payment){ 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(PAY_AMOUNT, payment.getAmount()); 
    values.put(PAY_DETAILS, payment.getDetails()); // Contact Phone Number 

    // Inserting Row 
    db.insert(PAYMENT_TABLE, null, values); 
    db.close(); 
} 

void addListItem(ArrayList<String> listItem) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    for (int i = 0; i < listItem.size(); i++) { 

     Log.e("vlaue inserting==", "" + listItem.get(i)); 
     values.put(PAY_AMOUNT, listItem.get(i)); 
     db.insert(PAYMENT_TABLE, null, values); 

    } 

    db.close(); // Closing database connection 
} 

Cursor getListItem() { 
    String selectQuery = "SELECT * FROM " + PAYMENT_TABLE; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    return cursor; 
}} 

Et enfin, c'est l'activité de détails, il contient une vue de la liste qui stocke et affiche tous les paiements ont été effectués:

public class DetailsActivity extends AppCompatActivity { 

ArrayList<String> detailsListArrayList; 
private ListView lv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 

    lv = (ListView) findViewById(R.id.listView); 
    detailsListArrayList = new ArrayList<>(); 

    detailsListArrayList.add("Item1"); 
    detailsListArrayList.add("Item2"); 
    detailsListArrayList.add("Item3"); 
    detailsListArrayList.add("Item4"); 
    detailsListArrayList.add("Item5"); 

    Paid_DB db = new Paid_DB(this); 

    db.addListItem(detailsListArrayList); 

    Cursor cursor = db.getListItem(); 

    Log.e("count", " " + cursor.getCount()); 
    if (cursor != null) { 
     cursor.moveToNext(); 

     do { 

      Log.e("value==", "" + cursor.getString(1)); 

     } while (cursor.moveToNext()); 
    } 

    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_list_item_1, 
      detailsListArrayList); 

    lv.setAdapter(arrayAdapter); 
} 
} 

fichier XML :

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.user.paid.DetailsActivity"> 

<ListView 
    android:id="@+id/listView" 
    android:layout_width="368dp" 
    android:layout_height="495dp" 
    tools:layout_editor_absoluteX="8dp" 
    tools:layout_editor_absoluteY="8dp" /> 

Chaque fois que je clique sur le bouton "test", l'application se bloque. Et chaque fois que j'essaie d'ajouter une nouvelle entrée en utilisant le bouton "dépenser", l'application plante aussi. Qu'ai-je fait de mal?

+0

'Je n'ai pas mis en œuvre comment Je vais mettre à jour le montant total yet' -> 'SELECT Somme (Amount) AS Total FROM PaymentTable' devrait faire l'affaire –

+2

s'il vous plaît partager votre journal des erreurs – Pynnie

+0

' Qu'est-ce que je fais mal? 'Par exemple, vos mises en page sont incomplètes **. Heureusement, ils ne le sont pas dans votre projet. –

Répondre

0

Ce que je peux dire d'ici (sans le journal d'erreur) est:

1) votre application se bloque lorsque vous appuyez sur le test-bouton parce que vous commencez une activité là-bas sans passer un objet context. Essayez ceci:

public void onClick(View v) { 
     Intent i = new Intent(getApplicationContext(), DetailsActivity.class); 
     startActivity(i); 
    } 

2) Le bouton dépenses tente d'ajouter une nouvelle entrée de paiement à votre base de données. Mais dans votre schéma de base de données, vous déclarez le PAY_ID en tant que clé primaire. Plus tard, dans votre addPayment(), vous venez de passer le PAY_AMOUNT et PAY_DETAILS, donc il vous manque le PAY_ID qui semble conduire à un plantage. Quelque chose comme ceci devrait renvoyer tous les paiements comme un ArrayList (peut contenir des bogues, juste l'a écrit dans cet éditeur).

public ArrayList<Payment> getAllPayments() { 
     ArrayList<Payment> result = new ArrayList<>(); 
     Cursor c = db.query("PAYMENTS",new String[]{"PAY_ID","PAY_AMOUNT","PAY_DETAIL"},null,null,null,null,null); ; 

     c.moveToFirst(); 

     while(! c.isAfterLast()) 
     { 
      int s1=c.getInt(0); 
      int s2=c.getInt(1); 
      String s3=c.getString(2); 

      results.add(new Payment(s1,s2,s3)); 

      c.moveToNext(); 
     } 
     return results; 

}

Pour mettre à jour votre ListView, vous devriez avoir de plus près un ce lien, qui explique comment travailler avec listviews et un adaptateur ListView personnalisé Custom Adapter for List View

+0

Eh bien, j'ai fait ce que vous avez suggéré et les deux ont bien fonctionné. En ce moment, je peux cliquer sur le bouton dépenser et il ne plante pas (tant qu'il y a une valeur dans le texte d'édition, puisque je n'ai pas attrapé cette exception évidemment). Je peux également cliquer sur le bouton de test pour voir la liste sans problèmes. Maintenant, j'ai besoin de savoir comment mettre à jour le montant total dans le textView, comme le gars ci-dessus suggéré, mais je ne suis pas sûr de la façon de l'implémenter. En outre, comment suis-je censé remplir la liste à chaque fois que j'entre de nouvelles valeurs? parce que maintenant il affiche seulement "Liste élément 1", "Liste élément 2" etc. – Kirito

+0

voir mon post modifier – Pynnie

+0

Je suis désolé, je ne comprends pas comment et où je suis censé appliquer votre méthode? – Kirito