【发布时间】:2019-01-03 15:28:11
【问题描述】:
我创建了以下方法来生成系列的平均分数:
//Getting Series Averages From Game.COLUMN_SCORE
public String getSeriesAverage(String leagueId, String bowlerId)
{
String total = "";
Series series = new Series();
ContentValues values = new ContentValues();
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("SELECT AVG(" + Game.COLUMN_SCORE + ") FROM " + Game.TABLE_NAME + " WHERE " + Game.COLUMN_LEAGUE_ID + " = '" + leagueId + "'" + " AND " + Game.COLUMN_BOWLER_ID + " = '" + bowlerId + "'" + " GROUP BY " + Game.COLUMN_SERIES_ID /*+ " = '" + seriesId + "'"*/, null);
if (cursor.moveToFirst()) {
do {
total = cursor.getString(0);
values.put(Series.COLUMN_SERIES_AVERAGE, total);
database.update(Series.TABLE_NAME, values, Series.COLUMN_ID + "=" + series.getId(), null);
Log.d("SERIES_AVERAGE - SQL","COLUMN_SERIES_AVERAGE = >>>>" + Series.COLUMN_SERIES_AVERAGE + "<<<<");
Log.d("TOTAL - CURSOR VALUE","Total = >>>>" + total + "<<<<");
} while (cursor.moveToNext());
values.put(Series.COLUMN_SERIES_AVERAGE, total);
database.update(Series.TABLE_NAME, values, Series.COLUMN_ID + "=" + series.getId(), null);
}
cursor.close();
//Close Database Connection
database.close();
//Log.d("GET AVERAGE FROM SQL","Average = >>>>" + total + "<<<<");
return total;
}
它似乎有效,我可以在 Logcat 中看到为单个投球手列出的每个系列的平均值:
07-26 14:50:15.158 25330-25330/ca.rvogl.tpbcui D/GETALLSERIES-SQL: SQL used = >>>>SELECT * FROM Series WHERE league_id = '1' AND bowler_id = '1' ORDER BY timestamp DESC<<<<
07-26 14:50:15.167 25330-25330/ca.rvogl.tpbcui D/GETALLSERIESS-CNT: Number of rows retrieved = 3
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>207<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>111<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>300<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>1<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF SERIES: Average = >>>>1<<<<
07-26 14:50:15.177 25330-25330/ca.rvogl.tpbcui D/GETALLSERIES-CNT: Number of elements in serieslist = 3
但是,您也可以从 logcat 中看到该值没有被写入数据库,如下所示:
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>300<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
它实际上只是显示来自Series Class的变量的名称。
谁能帮我把这些值写入数据库。我不确定我做错了什么,任何帮助将不胜感激。如果您需要查看任何其他代码,请告诉我,我会发布它。
系列表的结构:
// Create table SQL query
public static final String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_LEAGUE_ID + " TEXT,"
+ COLUMN_BOWLER_ID + " TEXT,"
+ COLUMN_NAME + " TEXT,"
+ COLUMN_SERIES_AVERAGE + " TEXT,"
+ COLUMN_TIMESTAMP + " DATETIME DEFAULT CURRENT_TIMESTAMP"
+ ")";
public Series() {
}
public Series(int id, String league_id, String bowler_id, String name, String average, String timestamp) {
this.id = id;
this.league_id = league_id;
this.bowler_id = bowler_id;
this.name = name;
this.average = average;
this.timestamp = timestamp;
}
Logcat:
07-26 19:00:42.250 32441-32441/ca.rvogl.tpbcui D/GETALLSERIES-SQL: SQL used = >>>>SELECT * FROM Series WHERE league_id = '1' AND bowler_id = '1' ORDER BY timestamp DESC<<<<
07-26 19:00:42.263 32441-32441/ca.rvogl.tpbcui D/GETALLSERIESS-CNT: Number of rows retrieved = 2
07-26 19:00:42.279 32441-32441/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>null<<<<
07-26 19:00:42.279 32441-32441/ca.rvogl.tpbcui D/TOTAL - CURSOR VALUE: Total = >>>>111<<<<
07-26 19:00:42.281 32441-32441/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>null<<<<
07-26 19:00:42.281 32441-32441/ca.rvogl.tpbcui D/TOTAL - CURSOR VALUE: Total = >>>>300<<<<
07-26 19:00:42.286 32441-32441/ca.rvogl.tpbcui D/GETALLSERIES-CNT: Number of elements in serieslist = 2
系列活动
public class SeriesActivity extends AppCompatActivity {
private SeriesAdapter mAdapter;
private final List<Series> seriesList = new ArrayList<>();
private TextView noSeriesView;
private DatabaseHelper db;
private TextView leagueId;
private String savedLeagueId;
private TextView bowlerId;
private String savedBowlerId;
private TextView seriesAverage;
private String savedSeriesAverage;
private static final String PREFS_NAME = "prefs";
private static final String PREF_BLUE_THEME = "blue_theme";
private static final String PREF_GREEN_THEME = "green_theme";
private static final String PREF_ORANGE_THEME = "purple_theme";
private static final String PREF_RED_THEME = "red_theme";
private static final String PREF_YELLOW_THEME = "yellow_theme";
@Override
protected void onCreate(Bundle savedInstanceState) {
//Use Chosen Theme
SharedPreferences preferences = getSharedPreferences( PREFS_NAME, MODE_PRIVATE );
boolean useBlueTheme = preferences.getBoolean( PREF_BLUE_THEME, false );
if (useBlueTheme) {
setTheme( R.style.AppTheme_Blue_NoActionBar );
}
boolean useGreenTheme = preferences.getBoolean( PREF_GREEN_THEME, false );
if (useGreenTheme) {
setTheme( R.style.AppTheme_Green_NoActionBar );
}
boolean useOrangeTheme = preferences.getBoolean( PREF_ORANGE_THEME, false );
if (useOrangeTheme) {
setTheme( R.style.AppTheme_Orange_NoActionBar );
}
boolean useRedTheme = preferences.getBoolean( PREF_RED_THEME, false );
if (useRedTheme) {
setTheme( R.style.AppTheme_Red_NoActionBar );
}
boolean useYellowTheme = preferences.getBoolean( PREF_YELLOW_THEME, false );
if (useYellowTheme) {
setTheme(R.style.AppTheme_Yellow_NoActionBar);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_series);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar( toolbar );
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String seriesLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
String seriesBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
Intent intent=new Intent();
intent.putExtra("seriesLeagueId",seriesLeagueId);
intent.putExtra("seriesBowlerId",seriesBowlerId);
setResult(1,intent);
finish();//finishing activity
overridePendingTransition(0, 0);
}
/*@Override
public void onClick(View v) {
startActivity(new Intent(SeriesActivity.this, BowlerActivity.class));
finish();
}*/
});
savedLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
leagueId = (TextView) findViewById( R.id.tvLeagueId );
savedBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
bowlerId = (TextView) findViewById( R.id.tvBowlerId );
seriesAverage = (TextView) findViewById(R.id.tvSeriesAverage);
CoordinatorLayout coordinatorLayout = findViewById( R.id.coordinator_layout );
RecyclerView recyclerView = findViewById( R.id.recycler_view );
noSeriesView = findViewById( R.id.empty_series_view );
db = new DatabaseHelper( this );
seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId) );
FloatingActionButton fab = (FloatingActionButton) findViewById( R.id.add_series_fab );
fab.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
showSeriesDialog( false, null, -1 );
}
} );
mAdapter = new SeriesAdapter( this, seriesList );
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager( getApplicationContext() );
recyclerView.setLayoutManager( mLayoutManager );
recyclerView.setItemAnimator( new DefaultItemAnimator() );
recyclerView.addItemDecoration( new MyDividerItemDecoration( this, LinearLayoutManager.VERTICAL, 16 ) );
recyclerView.setAdapter( mAdapter );
toggleEmptySeries();
//On Long Click On The RecyclerView Item An Alert Dialog Is Opened With The Option To Choose Edit/Delete
recyclerView.addOnItemTouchListener( new RecyclerTouchListener( this, recyclerView, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, final int position) {
int seriesId = seriesList.get( position ).getId();
String seriesLeagueId = seriesList.get( position ).getLeagueId();
String seriesBowlerId = seriesList.get( position ).getBowlerId();
Intent myIntent = new Intent( SeriesActivity.this, GameActivity.class );
myIntent.putExtra( "gameLeagueId", seriesLeagueId );
myIntent.putExtra( "gameBowlerId", seriesBowlerId );
myIntent.putExtra( "gameSeriesId", seriesId );
startActivityForResult(myIntent, 1);
overridePendingTransition(0, 0);
}
@Override
public void onLongClick(View view, int position) {
showActionsDialog( position );
}
} ) );
}
//Inserting New Series In The Database And Refreshing The List
private void createSeries(String leagueId, String bowlerId, String series) {
//Inserting Series In The Database And Getting Newly Inserted Series Id
long id = db.insertSeries( leagueId, bowlerId, series );
//Get The Newly Inserted Series From The Database
Series n = db.getSeries( leagueId, bowlerId );
if (n != null) {
//Adding New Series To The Array List At Position 0
seriesList.add( 0, n );
//Refreshing The List
mAdapter.notifyDatasetChanged( db.getAllSeries( savedLeagueId, savedBowlerId ) );
toggleEmptySeries();
}
}
//Updating Series In The Database And Updating The Item In The List By Its Position
private void updateSeries(String name, int position) {
Series n = seriesList.get( position );
//Updating Series Text
n.setLeagueId( savedLeagueId );
n.setBowlerId( savedBowlerId );
n.setName( name );
//Updating The Series In The Database
db.updateSeries( n );
//Refreshing The List
seriesList.set( position, n );
//mAdapter.notifyItemChanged(position);
mAdapter.notifyDatasetChanged( db.getAllSeries( savedLeagueId, savedBowlerId ) );
toggleEmptySeries();
}
//Deleting Series From SQLite Database And Removing The Bowler Item From The List By Its Position
private void deleteSeries(int position) {
//Deleting The Series From The Database
db.deleteSeries( seriesList.get( position ) );
//Removing The Bowler From The List
seriesList.remove( position );
mAdapter.notifyItemRemoved( position );
toggleEmptySeries();
}
//Opens Dialog With Edit/Delete Options
//Edit - 0
//Delete - 0
private void showActionsDialog(final int position) {
CharSequence colors[] = new CharSequence[]{"Edit", "Delete"};
AlertDialog.Builder builder = new AlertDialog.Builder( this );
builder.setTitle( "Choose option" );
builder.setItems( colors, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
showSeriesDialog( true, seriesList.get( position ), position );
} else {
deleteSeries( position );
}
}
} );
builder.show();
}
//Show Alert Dialog With EditText Options to Enter/Edit A Series
//When shouldUpdate = true, It Will Automatically Display Old Series Name And Change The Button Text To UPDATE
private void showSeriesDialog(final boolean shouldUpdate, final Series series, final int position) {
LayoutInflater layoutInflaterAndroid = LayoutInflater.from( getApplicationContext() );
final View view = View.inflate( this, R.layout.dialog_series, null );
AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder( SeriesActivity.this );
alertDialogBuilderUserInput.setView( view );
final EditText inputSeries = view.findViewById( R.id.etSeriesNameInput );
leagueId.setText( savedLeagueId );
bowlerId.setText( savedBowlerId );
TextView dialogTitle = view.findViewById( R.id.dialog_title );
dialogTitle.setText( !shouldUpdate ? getString( R.string.lbl_new_series_title ) : getString( R.string.lbl_edit_series_title ) );
if (shouldUpdate && series != null) {
inputSeries.setText( series.getName() );
leagueId.setText( series.getLeagueId() );
bowlerId.setText( series.getBowlerId() );
}
alertDialogBuilderUserInput.setCancelable( false ).setPositiveButton( shouldUpdate ? "update" : "save", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogBox, int id) {
}
} ).setNegativeButton( "cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogBox, int id) {
dialogBox.cancel();
}
} ) .setNeutralButton("use date",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogBox, int id) {
String dateNow = getDateNow();
inputSeries.setText(dateNow);
}
});
final AlertDialog alertDialog = alertDialogBuilderUserInput.create();
alertDialog.show();
alertDialog.getButton( AlertDialog.BUTTON_NEUTRAL ).setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
//Show Toast Message When No Text Is Entered
if (inputSeries.getText().toString() !=null || !inputSeries.getText().toString().isEmpty() ) {
String dateNow = getDateNow();
inputSeries.setText(dateNow);
return;
} else {
alertDialog.dismiss();
}
//Check If User Is Updating Series
if (shouldUpdate && series != null) {
//Updating Series By Its Id
updateSeries( inputSeries.getText().toString(), position );
} else {
//Creating New Series
createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
}
}
} );
alertDialog.getButton( AlertDialog.BUTTON_POSITIVE ).setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
//Show Toast Message When No Text Is Entered
if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
Toast.makeText( SeriesActivity.this, "Enter Series!", Toast.LENGTH_SHORT ).show();
return;
} else {
alertDialog.dismiss();
}
//Check If User Is Updating Series
if (shouldUpdate && series != null) {
//Updating Series By Its Id
updateSeries( inputSeries.getText().toString(), position );
} else {
//Creating New Series
createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
}
}
} );
}
//Toggling List And Empty Series View
private void toggleEmptySeries() {
//You Can Check seriesList.size() > 0
if (db.getSeriesCount() > 0) {
noSeriesView.setVisibility( View.GONE );
} else {
noSeriesView.setVisibility( View.VISIBLE );
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate( R.menu.menu_main, menu );
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
overridePendingTransition(0, 0);
return true;
}
return super.onOptionsItemSelected( item );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
//Check If Request Code Is The Same As What Is Passed - Here It Is 1
if(requestCode==1)
{
String savedLeagueId=data.getStringExtra("seriesLeagueId");
String savedBowlerId=data.getStringExtra("seriesBowlerId");
seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId ) );
}
}
private String getDateNow() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE. MMM. dd, yyyy", Locale.ENGLISH);
return sdf.format(cal.getTime());
}
@Override protected void onResume() {
super.onResume(); //seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId) );
}
}
【问题讨论】:
标签: javascript android sqlite android-studio