2017-10-17 1 views
-1

기본적으로 텍스트 뷰의 값이 150,000으로 설정된 작은 응용 프로그램을 개발하고 있습니다. 매달 나는 값을 기본값으로 재설정했다. 그 금액 중 일부를 쓸 때마다 내 앱을 열고 지출 한 금액과 지출 한 내용을 입력합니다.특정 값 업데이트 및 오프라인 데이터베이스에 저장

내가 수행 한 작업은 이드와 세부 사항과 함께 그 금액 중 일부를 소비 한 모든 시간을 저장하는 오프라인 데이터베이스를 만드는 것이 었습니다. "지출"버튼을 누를 때마다, 총 금액은 제가 EditText에 입력 한 금액만큼 줄어 듭니다.

아직 총액을 업데이트하는 방법을 구현하지 않았으므로 sharedpreference 번호라는 것을 사용해야합니다.

이 주요 활동 :

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

    }); 

XML 파일 : 이것은 ID를 포함, 오프라인 데이터베이스에 입력 개체가, 양이 소비되는

<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" /> 

, 지불 세부 정보 :

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

이 오프라인 데이터베이스입니다 :

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

그리고 마지막으로,이 세부 활동, 그것은 저장하는 목록보기를 포함되었습니다 모든 지불 표시

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

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" /> 

내가 클릭 할 때마다 "테스트"버튼을 클릭하면 앱이 다운됩니다. 그리고 "지출"버튼을 사용하여 새로운 항목을 추가하려고 할 때마다 앱도 충돌합니다. 나는 무엇을 잘못 했는가?

여기에서 (오류 로그없이) 말할 수있는 무엇
+0

와 함께 작동하는 방법에 대해 설명이 링크,'내가 어떻게 구현하지 않은 모습을 가져야한다 나는 총 금액을 아직 업데이트 할 것입니다. ->'SELECT Sum (Amount) PaymentTable FROM PaymentTable Total '은 트릭을해야합니다 –

+2

오류 로그를 공유하십시오 – Pynnie

+0

'내가 뭘 잘못 했습니까?'예를 들어, 레이아웃이 ** 불완전합니다 **. 바라건대, 그들은 당신의 프로젝트에 그렇게 속해 있지 않습니다. –

답변

0

이다 : 당신이 context 객체를 전달하지 않고이 활동을 시작하기 때문에

1) 앱 충돌 테스트 버튼을 누르면. 이것을 시도하십시오 :

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

2) 지출 버튼은 데이터베이스에 새 지불 항목을 추가하려고 시도합니다. 그러나 데이터베이스 스키마에서 PAY_ID를 기본 키로 선언하십시오. 나중에 addPayment()에서 PAY_AMOUNT 및 PAY_DETAILS을 전달하는 중일 뿐이므로 충돌로 이어지는 PAY_ID가 누락되었습니다.

수정 : 이와 비슷한 항목은 모든 지불을 ArrayList로 반환해야합니다 (버그가있을 수 있으며,이 편집기에서 작성한 것일 수 있음).

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; 

}

당신의 ListView를 업데이트하려면, 당신은 가까이의 ListView 및 사용자 지정 ListView에 어댑터 Custom Adapter for List View

+0

글쎄, 나는 당신이 제안한 것을했고 둘 다 괜찮 았어. 지금은 지출 버튼을 클릭 할 수 있으며 충돌이 발생하지 않습니다 (편집 텍스트에 값이있는 한 해당 예외를 분명히 알지 못하기 때문에). 또한 문제없이 목록보기를 보려면 테스트 버튼을 클릭 할 수 있습니다. 이제, 위의 녀석이 제안한대로 textView에서 전체 양을 업데이트하는 방법을 알아야하지만 구현 방법을 모르겠습니다. 또한 새 값을 입력 할 때마다 목록보기를 채우려면 어떻게해야합니까? 왜냐하면 지금은 "목록 항목 1", "목록 항목 2"등만 표시하기 때문입니다. – Kirito

+0

내 게시물보기 편집 – Pynnie

+0

죄송합니다. 귀하의 방법을 어떻게 적용해야할까요? – Kirito

관련 문제