Android sqlite如何设置多个条件更新数据?

比如要同时满足sex=boy,age=20这两个条件才更新
是update table set check = 'OK' where sex='boy' AND age ='20' 这样写吗?我试过不行

weixin_43846348
John Cheung 我想到的办法是先cursor多条件查出后把主键提取出来做为update的条件
11 个月之前 回复

2个回答

这个是不可以的,我之前没有成功过

weixin_43846348
John Cheung 那有什么办法吗?
11 个月之前 回复

我可以啊

图片说明

图片说明

weixin_43846348
John Cheung 我刚才试了一下是可以但是只有当where后面的条件有一个是主键才行。我看你发的图_alarm_id应该是主键吧
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用android的SQLite数据库能存储多大数据
看到网上说SQLite数据库的大小是2TB,但是我觉得这个数据库不应该跟手机内存相联系吗? android上的SQLite数据库真的能容纳下2TB的数据吗???
android Room数据库框架 怎么自定义 sqlite db文件路径
由于项目需要,需要保证删除app时保留数据库信息。 需要设置本地数据库文件到data外部。(保存db文件到sd卡 或者 本机) 当前项目本地数据库使用room。代码实现默认没有设置数据库文件的存储位置。 ``` private fun buildDatabase(appContext: Context, executors: AppExecutors): AppDatabase { return Room.databaseBuilder(appContext, AppDatabase::class.java, DATABASE_NAME).addCallback(object : RoomDatabase.Callback() {}) .allowMainThreadQueries() //允许在主线程查询数据 .addMigrations() //迁移数据库使用,下面会单独拿出来讲 .build() } ``` 百度了很多资料, 一般搜索出来的是 /data/data/<package name/databases>目录中 ``` public class DBHelper { //得到SD卡路径 private final String DATABASE_PATH = android.os.Environment .getExternalStorageDirectory().getAbsolutePath() + "/joke"; private final Activity activity; //数据库名 private final String DATABASE_FILENAME; public DBHelper(Context context) { // TODO Auto-generated constructor stub //这里直接给数据库名 DATABASE_FILENAME = "jokebook.db3"; activity = (Activity)context; } ``` 看这个搜索结果人都有些无奈了。 最多就是有人提到openHelperFactory这个方法 但是这个方法的具体实现感觉很复杂,不知道怎么实现。 项目中本地数据库记入的数据,需要数据回流服务器用来对账用的。所以要保证本地数据库数据不能被清除。 我知道greendao和纯sqlite是可以设置db文件到外部的(android本机 或者 sd卡中) 但是room这个框架怎么设置就抓瞎了。
SQLite 表固定长度 新数据将旧数据顶掉
我现在想用SQLite存储一些历史记录。 为了以防数据太多,对记录的数量进行了限制,如果数量超过最大长度,便删除最旧的那个数据再进行存储。 由于历史记录顺序不能变,添加数据必须在末尾进行添加。 功能已经实现,但是突然意识到一个问题,这样操作对于物理存储来说是否不太好。 因为总是删除首部那个数据,而在尾部进行添加,这块数据的存储空间就一直在移动。会不会引起不稳定的问题。 问一下各位大佬是怎么实现这种功能的。
android使用SQLite储存较大文件(图片、音频)的问题
在android开发中我想把一张图片或者一首歌存储在SQLite数据库中,但是考虑到SQLite数据库很小,装不了太多图片或者音频,我就想到了把图片或者音频转换成byte【】形式再进行存储,我想知道这种做法到底靠不靠谱,如果不靠谱请大神们给个思路指点一下,谢谢大家!!!
想要再EditText上保存一个整数,然后保存到SQLite上去计算
<TableRow> <Button android:id="@+id/Date1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Date1" android:onClick="Date1" /> <EditText android:id="@+id/SetDate1" android:layout_width="160dp" android:layout_height="wrap_content" android:hint="@string/EditText" /> </TableRow> 这是我想要实现数据的XML文件。所以到目前为止,我创建了一个对话框来选择数据,然后返回数据给EditText。 在哪,我想要再SQLite中保存数据,这样我就能用第二个数据来显示用户选择的两个数据之间的差异。 @Override protected Dialog onCreateDialog(int id) { switch (id) { case DATE_DIALOG_ID: return new DatePickerDialog( this, mDateSetListener, yr, month, day); case DATE_DIALOG_ID2: return new DatePickerDialog( this, mDateSetListener2, yr2, month2, day2); } return null; } private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet( DatePicker view, int year, int monthOfYear, int dayOfMonth) { yr = year; month = monthOfYear+1; day = dayOfMonth; db.open(); @SuppressWarnings("unused") long id = db.insertContact(month, day, yr); db.close(); textBox.setText(yr + "/" + month + "/" + day); } }; 我只是还没有上传第二个对话框来选择数据,因为这只是重复。在我把数据放到SQLite中或者是不管怎么样把它存上,我想要加、乘一个值给它然后在返回这个值给另外一个EditText。同时,有什么方式能让我的Date Button EditText是不可编辑状态,除非你点击button来改变EditText的内容,有这个方法么? 多些您能看完问题,如果有所帮助,我会非常感激的。
关于sqlite一个数据库创建多张表的问题 求大神指教!
我是新手 最近自己尝试做个小程序。关于一个数据库建多张表 小弟查阅一下,也不能得到解决,求高手指教下。 public void onCreate(SQLiteDatabase db) { String sqlCalendar = "CREATE TABLE IF NOT EXISTS calendar(pid integer primary key autoincrement," + "moon varchar(4)," + "day varchar(4)," + "year varchar(4)," + "hints varchar(8)," + "sort varchar(4)," + "tag text," + "memorialDay varchar(4))"; db.execSQL(sqlCalendar); String sqlSpend = "CREATE TABLE IF NOT EXISTS spend(spendid integer primary key autoincrement," + "moon varchar(4)," + "day varchar(4)," + "year varchar(4)," + "spendsort varchar(8)," + "spend varchar(4))"; db.execSQL(sqlSpend); } public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { // TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS calendar"); db.execSQL("DROP TABLE IF EXISTS spend"); onCreate(db); } 以上是帮助类的代码部分,服务部分的代码 public boolean insert(ScheduleDateTag sdt) { boolean flag = false; ContentValues values = new ContentValues(); values.put("moon", sdt.getMoon()); values.put("day", sdt.getDay()); values.put("year", sdt.getYear()); values.put("hints", sdt.getHints()); values.put("sort", sdt.getSort()); values.put("memorialDay", sdt.isMemorialDay()); values.put("tag", sdt.getWorkingTag()); try { db.insert("calendar", null, values); flag = true; } catch (Exception e) { flag = false; } return flag; } public boolean insert(SpendDateTag sdt) { boolean flag = false; db = dbOpenHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("moon", sdt.getMoon()); values.put("day", sdt.getDay()); values.put("year", sdt.getYear()); values.put("spendsort", sdt.getSpendSort()); values.put("spend", sdt.getSpend()); try { db.insert("spend", null, values); flag = true; } catch (Exception e) { flag = false; } return flag; } 这里创建calendar表可以创建,但是spend表创建不了,错误提示 android.database.sqlite.SQLiteException: no such table: spend (code 1): , while compiling: INSERT INTO spend(year,moon,day,spendsort,spend) VALUES (?,?,?,?,?) 求大神指教
android studio关于将txt文件导入litepal数据库的一些问题
我按照第一行代码的说明建立了一个数据库,有4列浮点型数字,想将txt文件的相关内容导入数据库中,苦于没有办法,参考了https://blog.csdn.net/moruna/article/details/38370113这个方法,这个是sqlite建立的数据库应该没多大差别才对,将这一行 private String DATABASE_CREATE = "create table pathcode(_id INTEGER PRIMARY KEY AUTOINCREMENT,code varchar(100),path varchar(200))"; 修改为四个浮点型数据,然后进行测试,很顺利,但提示应有5个数据只找到4个,将另一个置为null,但查看导入的数据后并没有问题, 可是在android studio中查询数据库并全部输出时,发现数字乱序(有一定规律的乱序),且第二列均被置为零,求帮助,需要图片等 更多信息请留言啊
数据库选择:mysql 还是sqlite3?
要开发一款手机APP,有多个用户。功能举例:用户A可以给用户B转账50元,A还可以查看自己的消费记录等 金额之类的都是用数据库模拟,现在不知道该用哪个数据库,求大神们指点一二(ಥ_ಥ)
Android 真机怎么安装sqlite3?
没有用虚拟机进行开发,一直用的小米手机进行的开发,现在已经将小米手机的系统刷成了开发版,并且已经root了,但是在cmd中使用sqlite3命令的时候,就会报 ``` sh: sqlite3: not found ``` 在网上查了很多也一直没有个解决的方法,有微博说使用cat命令,但是我也是没法成功,按照步骤已经把sqlite3以及libncurses.so下载到了E盘中的users中。 ``` 其解决方法是先将/system处于挂载状态,允许读写,命令如下: mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 就这一条命令我就又卡住了,总是出现 mount: Permission denied ``` 因为虚拟机一直安装不成功,也没有去换系统,就只能用真机进行开发,但是数据库这边这个问题太困扰我了,向大家求助! 大家谁用真机弄过sqlite3啊?
求助,如何将access的.mdb文件或者excel的.csv文件转换为sqlite的.db文件
在尝试做一个安卓项目,需要用到sqlite的数据库,但是手里的数据库是access的,已经在网上搜了三个多小时了,实在搞不定,求大神帮忙
SQLite查询数据之后传过去报错,不知道该怎么办了
~~~~~~~~~~~~~~~~~~~~~~~~detailed类~~~~~~~~~~~~~~~~~~~~ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.baidu.mapapi.SDKInitializer; import entity.point; public class detailed extends Activity { private ImageView img; private TextView lng; @Override protected void onCreate(Bundle savedInstanceState,SQLiteHelper msh,int pointId) { super.onCreate(savedInstanceState); setContentView(R.layout.self_layout); img = (ImageView)findViewById(R.id.vr); img.setOnClickListener(new ImageView.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(detailed.this,panorama.class); startActivity(intent); } }); point lngText = SQLiteHelper.getdetailedById(msh,1); lng = (TextView)findViewById(R.id.lngText); lng.setText("lngText"); } } ~~~~~~~~~~~~~~~~~~SQLiteHelper类~~~~~~~~~~~~~~~~~~~~~~ /** * 根据ID查询所有信息 * @return 返回一个对象s */ public static point getdetailedById(SQLiteHelper msh,int pointId) { point po = new point(); SQLiteDatabase db = msh.getWritableDatabase(); Cursor cursor = db.rawQuery( "select lng,lat,direction,uniformity,temperature,dustproof,material,metope,door,illumination," + "type from vr_point where pointID = " + pointId, null); if (cursor.moveToFirst()) { do { po.setLng(cursor.getDouble(0)); po.setLat(cursor.getDouble(1)); po.setDirection(cursor.getString(2)); po.setUniformity(cursor.getString(3)); po.setTemperature(cursor.getString(4)); po.setDustproof(cursor.getString(5)); po.setMaterial(cursor.getString(6)); po.setMetope(cursor.getString(7)); po.setDoor(cursor.getString(8)); po.setIllumination(cursor.getString(9)); po.setType(cursor.getString(10)); } while (cursor.moveToNext()); } cursor.close(); return po; } 报错!不知道怎么写了,改了很多次。求救,十万火急,赶着交差[图片说明](https://img-ask.csdn.net/upload/201603/22/1458654196_340606.png)
JAVA SQL数据库中两个表比较更新的语句
db.rawQuery("insert into minfo select * from info where name not in(select * from minfo)",null); 两个表比较然后把info表中多出的的name项插入到minfo表中,是这样写吗?求指导啊 报的错是 android.database.sqlite.SQLiteException: only a single result allowed for a SELECT that is part of an expression (code 1): , while compiling: insert into minfo select * from info where name not in(select * from minfo)
android studio做了个APP,其它用了JSOUP,碰到dopostback函数,无法加载
HfztbAcitivity package linpeng.ztb; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import android.app.Activity; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.opengl.Visibility; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.GridView; import android.widget.HorizontalScrollView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class HfztbActivity extends Activity implements OnClickListener { private GridView xml_gridview; private ListView xml_newslist; private Button foot_loadmore, prepare_refresh, gotoright, up, down, gotoother, gotoother2, gotoother3, gotoother4, gotoother5; private TextView foot_text; private ProgressBar foot_progressbar; private HorizontalScrollView horizontalScrollView; private SimpleAdapter listview_adapter; private ProgressBar refresh; private String list_button = "title1"; private int changenewslist = 1; private int[][] location = new int[5][2]; private boolean fist_open_title1 = true, fist_open_title2 = true, fist_open_title3 = true, fist_open_title4 = true, fist_open_title5 = true, goto_other_visiably = false;//fist_open_title6 = true, //fist_open_title7 = true, private boolean is_first_open = true; private final int FLINGDIS = 900; private List<Map<String, Object>> newslist = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> tempnewslist = new ArrayList<Map<String, Object>>(); private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 > -1) { prepare_refresh.setVisibility(0); refresh.setVisibility(8); Log.i("list_button", new IntToStrong().getname(msg.arg1) + list_button); changeFirstOpen(msg.arg1); if (list_button.equals(new IntToStrong().getname(msg.arg1))) { getNewsList(msg.arg1, false); } } if (msg.arg1 == -1) { prepare_refresh.setVisibility(0); refresh.setVisibility(8); Toast.makeText(HfztbActivity.this, "网络不通,请稍候再试", Toast.LENGTH_SHORT).show(); } } private void changeFirstOpen(int arg1) { if (arg1 == 0 && fist_open_title1) { fist_open_title1 = false; } else if (arg1 == 1 && fist_open_title2) { fist_open_title2 = false; } else if (arg1 == 2 && fist_open_title3) { fist_open_title3 = false; } else if (arg1 == 3 && fist_open_title4) { fist_open_title4 = false; } else if (arg1 == 4 && fist_open_title5) { fist_open_title5 = false; // } else if (arg1 == 5 && fist_open_title6) { // fist_open_title6 = false; // } else if (arg1 == 6 && fist_open_title7) { // fist_open_title7 = false; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); xml_gridview = (GridView) findViewById(R.id.xml_gridview); xml_gridview.setSelector(new ColorDrawable(Color.TRANSPARENT)); xml_newslist = (ListView) findViewById(R.id.newslist); prepare_refresh = (Button) findViewById(R.id.prepare_refresh); refresh = (ProgressBar) findViewById(R.id.refresh); gotoright = (Button) findViewById(R.id.gotoright); horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalScrollView); up = (Button) findViewById(R.id.up); down = (Button) findViewById(R.id.down); gotoother = (Button) findViewById(R.id.gotoother); gotoother2 = (Button) findViewById(R.id.gotoother2); gotoother3 = (Button) findViewById(R.id.gotoother3); gotoother4 = (Button) findViewById(R.id.gotoother4); gotoother5 = (Button) findViewById(R.id.gotoother5); LayoutInflater layoutInflater = getLayoutInflater(); View footView = layoutInflater.inflate(R.layout.foot, null); xml_newslist.addFooterView(footView); foot_loadmore = (Button) findViewById(R.id.foot_loadmore); foot_text = (TextView) findViewById(R.id.foot_text); foot_progressbar = (ProgressBar) findViewById(R.id.foot_progressbar); foot_loadmore.setOnClickListener(this); prepare_refresh.setOnClickListener(this); gotoright.setOnClickListener(this); up.setOnClickListener(this); down.setOnClickListener(this); gotoother.setOnClickListener(this); gotoother2.setOnClickListener(this); gotoother3.setOnClickListener(this); gotoother4.setOnClickListener(this); gotoother5.setOnClickListener(this); getNewsList(0, false); SimpleAdapter gridview_adapter = new SimpleAdapter(this, new ListData().getGridviewdata(), R.layout.gridview, new String[] { "grid_title" }, new int[] { R.id.grid_title }); listview_adapter = new SimpleAdapter(this, newslist, R.layout.newslistdetails, new String[] { "news_isend", "news_title", "news_time" }, new int[] { R.id.news_isend, R.id.news_title, R.id.news_time }); is_first_open = false; xml_gridview.setAdapter(gridview_adapter); xml_gridview.setOnItemClickListener(new onGridViewItemClick()); xml_newslist.setOnItemClickListener(new onListViewItemClick()); xml_newslist.setAdapter(listview_adapter); } private void getloction() { gotoother.getLocationOnScreen(location[0]); gotoother2.getLocationOnScreen(location[1]); gotoother3.getLocationOnScreen(location[2]); gotoother4.getLocationOnScreen(location[3]); gotoother5.getLocationOnScreen(location[4]); Log.i("x", location[0][0] + " " + location[0][1]); } private void getNewsList(int table_number, boolean is_fresh) { boolean has_fresh = false; String table_name = new IntToStrong().getname(table_number); DataBaseHelper dbh = new DataBaseHelper(this, table_name, null, 1); SQLiteDatabase sql = dbh.getReadableDatabase(); Cursor cursor = sql.query(table_name, new String[] { "newsclass", "newstitle", "newstime", "isread" }, "newsclass>?", new String[] { "-1" }, null, null, null); if (cursor.getCount() != 0 && is_fresh == false) { newslist.clear(); getNewsListByDatabase(cursor); prepare_refresh.setVisibility(0); refresh.setVisibility(8); if (!is_first_open) { listview_adapter.notifyDataSetChanged(); xml_newslist.setSelection(0); list_button = new IntToStrong().getname(table_number); } } else { list_button = new IntToStrong().getname(table_number); MyThread myThread = new MyThread(table_number, HfztbActivity.this); has_fresh = true; myThread.start(); } if (!has_fresh) { reFresh(table_name, table_number); } if (sql != null) { sql.close(); } if (dbh != null) { dbh.close(); } } private void reFresh(String table_name, int table_number) { if (fist_open_title1 && table_name == "title1") { MyThread myThread = new MyThread(table_number, HfztbActivity.this); myThread.start(); } else if (fist_open_title2 && table_name == "title2") { MyThread myThread = new MyThread(table_number, HfztbActivity.this); myThread.start(); } else if (fist_open_title3 && table_name == "title3") { MyThread myThread = new MyThread(table_number, HfztbActivity.this); myThread.start(); } else if (fist_open_title4 && table_name == "title4") { MyThread myThread = new MyThread(table_number, HfztbActivity.this); myThread.start(); } else if (fist_open_title5 && table_name == "title5") { MyThread myThread = new MyThread(table_number, HfztbActivity.this); myThread.start(); //} else if (fist_open_title6 && table_name == "title6") { // MyThread myThread = new MyThread(table_number, HfztbActivity.this); // myThread.start(); //} else if (fist_open_title7 && table_name == "title7") { // MyThread myThread = new MyThread(table_number, HfztbActivity.this); // myThread.start(); } } private void getNewsListByDatabase(Cursor cursor) { newslist.clear(); while (cursor.moveToNext()) { Map<String, Object> map = new HashMap<String, Object>(); map.put("news_title", cursor.getString(cursor.getColumnIndex("newstitle"))); map.put("news_time", cursor.getString(cursor.getColumnIndex("newstime"))); map.put("news_isend", cursor.getString(cursor.getColumnIndex("isread"))); newslist.add(map); } } class onGridViewItemClick implements OnItemClickListener { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { int table_number = arg2; TextView gridviewback = (TextView) arg1; for (int i = 0; i < arg0.getCount(); i++) { TextView gridview_text_temp = (TextView) arg0.getChildAt(i); gridview_text_temp.setBackgroundDrawable(null); gridview_text_temp.setTextColor(getResources().getColor( R.color.grid_title_color)); } gridviewback.setBackgroundResource(R.drawable.gridviewbackground); gridviewback.setTextColor(Color.WHITE); if (arg2 >= 0 && arg2 <= 6) { getNewsList(table_number, false); Log.i("after", "thread"); } } } class onListViewItemClick implements OnItemClickListener { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { DataBaseHelper dbh = new DataBaseHelper(HfztbActivity.this, list_button, null, 1); SQLiteDatabase sq = dbh.getReadableDatabase(); Cursor cursor = sq.query(list_button, new String[] { "newsclass", "newstitle", "newstime", "isread", "url" }, "newsclass=?", new String[] { arg2 + "" }, null, null, null); cursor.moveToNext(); Intent intent = new Intent(HfztbActivity.this, News.class);// ��ת������ҳ if (!cursor.isAfterLast()) { intent.putExtra("newsurl", cursor.getString(cursor.getColumnIndex("url"))); intent.putExtra("newstitle", cursor.getString(cursor.getColumnIndex("newstitle"))); intent.putExtra("newstime", cursor.getString(cursor.getColumnIndex("newstime"))); intent.putExtra("type", list_button); startActivity(intent); } if (dbh != null) { dbh.close(); sq.close(); } } } public class MyThread extends Thread { private int table_number; private Context context; public MyThread(int table_number, Context context) { this.table_number = table_number; this.context = context; } @Override public void run() { getNewsList(table_number); } protected void getNewsList(int table_number) { try { Document doc; String url = "http://ggzy.jiangxi.gov.cn/jxzbw/jyxx/002004/00200400" + (table_number + 1) + "/MoreInfo.aspx?CategoryNum=00200400"+ (table_number + 1); doc = Jsoup.connect(url).get(); new ListData().getListData(doc, table_number, context, url); Message msg = handler.obtainMessage(); msg.arg1 = table_number; handler.sendMessage(msg); } catch (IOException e) { Log.i("tag", "error"); Message msg = handler.obtainMessage(); msg.arg1 = -1; handler.sendMessage(msg); e.printStackTrace(); } } } public void onClick(View v) { if (v.getId() == foot_loadmore.getId()) { foot_loadmore.setVisibility(8); foot_text.setVisibility(0); foot_progressbar.setVisibility(0); } if (v.getId() == prepare_refresh.getId()) { prepare_refresh.setVisibility(8); refresh.setVisibility(0); getNewsList(new IntToStrong().table_name_to_int(list_button), true); } if (v.getId() == gotoright.getId()) { horizontalScrollView.fling(FLINGDIS); Log.i("" + horizontalScrollView.getScrollY(), horizontalScrollView.getScrollX() + ""); } if (v.getId() == up.getId()) { xml_newslist.setSelection(0); } if (v.getId() == down.getId()) { Log.i("asff", xml_newslist.getScrollY() + ""); xml_newslist.setSelection(1000); } if (v.getId() == gotoother.getId()) { getloction(); if (!goto_other_visiably) { setVisiablyAndAnimation(false, -1); } else { Log.i("x", location[0][0] + " " + location[0][1]); setVisiablyAndAnimation(true, 0); } } if (v.getId() == gotoother2.getId()) { setVisiablyAndAnimation(false, 0); } if (v.getId() == gotoother3.getId()) { setVisiablyAndAnimation(false, 1); } if (v.getId() == gotoother4.getId()) { setVisiablyAndAnimation(false, 2); } if (v.getId() == gotoother5.getId()) { setVisiablyAndAnimation(false, 3); } } private void setVisiablyAndAnimation(boolean b, int which) { if (!b && which > -1) { ScaleAnimation[] scaleAnimations = getScaleAnimation(which); gotoother2.startAnimation(scaleAnimations[0]); gotoother3.startAnimation(scaleAnimations[1]); gotoother4.startAnimation(scaleAnimations[2]); gotoother5.startAnimation(scaleAnimations[3]); gotoother2.setVisibility(8); gotoother3.setVisibility(8); gotoother4.setVisibility(8); gotoother5.setVisibility(8); goto_other_visiably = false; } else if (which == -1) { TranslateAnimation[] translateAnimations = getTranslateAnimation(which); gotoother2.startAnimation(translateAnimations[0]); gotoother3.startAnimation(translateAnimations[1]); gotoother4.startAnimation(translateAnimations[2]); gotoother5.startAnimation(translateAnimations[3]); gotoother2.setVisibility(0); gotoother3.setVisibility(0); gotoother4.setVisibility(0); gotoother5.setVisibility(0); goto_other_visiably = true; } else { TranslateAnimation[] translateAnimations = getTranslateAnimation(which); gotoother2.startAnimation(translateAnimations[0]); gotoother3.startAnimation(translateAnimations[1]); gotoother4.startAnimation(translateAnimations[2]); gotoother5.startAnimation(translateAnimations[3]); gotoother2.setVisibility(8); gotoother3.setVisibility(8); gotoother4.setVisibility(8); gotoother5.setVisibility(8); goto_other_visiably = false; } } private TranslateAnimation[] getTranslateAnimation(int which) { TranslateAnimation[] translateAnimations = new TranslateAnimation[4]; if (which == -1) { translateAnimations[0] = new TranslateAnimation(Animation.ABSOLUTE, location[0][0] - location[1][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[1][1], Animation.RELATIVE_TO_SELF, 0f); translateAnimations[1] = new TranslateAnimation(Animation.ABSOLUTE, location[0][0] - location[2][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[2][1], Animation.RELATIVE_TO_SELF, 0f); translateAnimations[2] = new TranslateAnimation(Animation.ABSOLUTE, location[0][0] - location[3][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[3][1], Animation.RELATIVE_TO_SELF, 0f); translateAnimations[3] = new TranslateAnimation(Animation.ABSOLUTE, location[0][0] - location[4][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[4][1], Animation.RELATIVE_TO_SELF, 0f); translateAnimations[0].setDuration(100); translateAnimations[1].setDuration(150); translateAnimations[2].setDuration(200); translateAnimations[3].setDuration(250); } else { translateAnimations[0] = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][0] - location[1][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[1][1]); translateAnimations[1] = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][0] - location[2][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[2][1]); translateAnimations[2] = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][0] - location[3][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[3][1]); translateAnimations[3] = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][0] - location[4][0], Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, location[0][1] - location[4][1]); translateAnimations[0].setDuration(250); translateAnimations[1].setDuration(200); translateAnimations[2].setDuration(150); translateAnimations[3].setDuration(100); } return translateAnimations; } private ScaleAnimation[] getScaleAnimation(int which) { ScaleAnimation[] scaleAnimations = new ScaleAnimation[4]; scaleAnimations[0] = new ScaleAnimation(1, 0.1f, 1, 0.1f); scaleAnimations[1] = new ScaleAnimation(1, 0.1f, 1, 0.1f); scaleAnimations[2] = new ScaleAnimation(1, 0.1f, 1, 0.1f); scaleAnimations[3] = new ScaleAnimation(1, 0.1f, 1, 0.1f); scaleAnimations[which] = new ScaleAnimation(1, 1.7f, 1, 1.7f); scaleAnimations[0].setDuration(150); scaleAnimations[1].setDuration(150); scaleAnimations[2].setDuration(150); scaleAnimations[3].setDuration(150); return scaleAnimations; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Builder builder = new Builder(this); builder.setMessage("确定退出吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.exit(0); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.show(); } return true; } } Listdata package linpeng.ztb; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import android.widget.Toast; public class ListData { public List<Map<String, String>> getGridviewdata() { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); HashMap<String, String> hash = new HashMap<String, String>(); hash.put("grid_title", "采购公告"); list.add(hash); hash = new HashMap<String, String>(); hash.put("grid_title", "变更公告"); list.add(hash); hash = new HashMap<String, String>(); hash.put("grid_title", "答疑澄清"); list.add(hash); hash = new HashMap<String, String>(); hash.put("grid_title", "结果公示"); list.add(hash); hash = new HashMap<String, String>(); hash.put("grid_title", "单一来源"); list.add(hash); //hash = new HashMap<String, String>(); //hash.put("grid_title", "标前公示ʾ"); //list.add(hash); //hash = new HashMap<String, String>(); //hash.put("grid_title", "巢湖"); //list.add(hash); return list; } public void getListData(Document doc, int table_number, Context context, String url) { try { Element ele = doc.select("td[height=500]").first(); Elements eles = ele.select("a"); int newsclass = 0; String table_name = new IntToStrong().getname(table_number); if (ele.text().length() > 1) { DataBaseHelper dbh = new DataBaseHelper(context, table_name, null, 1); Log.i("shanchu", "ca"); dbh.dellAll(); } if (table_number != 3 && table_number != 5) { for (Element ele2 : eles) { String inittext = ele2.text(); String isend = "报名结束"; String changetext = inittext.replace("【正在报名】", "");// 替换文中的【正在报名】 String newsurl = ele2.attr("abs:href"); if (changetext.length() != inittext.length()) { isend = "正在报名"; } else { changetext = changetext.replace("【报名结束】", "");// 替换文中的【报名结束】 } if (ele2.text().replace("更多信息", "").length() >= 2) { DataBaseHelper dbh = new DataBaseHelper(context, table_name, null, 1); SQLiteDatabase sqh = dbh.getWritableDatabase(); dbh.addnewslist(newsclass, changetext, ele2.parent() .parent().select("td").last().text(), isend, newsurl); newsclass++; } } } else { for (Element ele2 : eles) { String inittext = ele2.text(); String newsurl = ele2.attr("abs:href"); String name = new IntToStrong().getname(table_number); if (ele2.text().replace("更多信息", "").length() >= 2) { DataBaseHelper dbh = new DataBaseHelper(context, name, null, 1); SQLiteDatabase sqh = dbh.getWritableDatabase(); dbh.addnewslist(newsclass, inittext, ele2.parent() .parent().select("td").last().text(), "", newsurl); newsclass++; } } } } catch (Exception e) { Log.i("s", "网络不通"); // Toast.makeText(context, "网络不通,请稍候再试",Toast.LENGTH_SHORT).show(); } } } NEWS package linpeng.ztb; import java.util.HashMap; import java.util.Map; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.R.integer; import android.app.Activity; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RemoteViews.ActionException; import android.widget.TextView; import android.widget.Toast; public class News extends Activity { private TextView news_details_text, news_details_title, news_details_time; private ProgressBar news_details_progress; private int flag = 1, arg2, text_size;// flag=1表示从网络获取数据=0表示从数据库获取数据 private String kind, url; private String newsdetailstext = "", downloadtext = "", downloadaddress = "", type; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.arg1) { case 1: if (newsdetailstext.length() > 3) { putData(); } else { Toast.makeText(News.this, "网络不通,请稍后再试", Toast.LENGTH_SHORT) .show(); } news_details_text.setText(newsdetailstext); news_details_progress.setVisibility(8); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.news); Intent intent = getIntent(); SharedPreferences s = getSharedPreferences("text_size", 0); text_size = s.getInt("text_size", 20); url = intent.getStringExtra("newsurl"); type = intent.getStringExtra("type"); String newstitle = intent.getStringExtra("newstitle"); String newstime = intent.getStringExtra("newstime"); news_details_text = (TextView) findViewById(R.id.news_details_text); news_details_title = (TextView) findViewById(R.id.news_details_title); news_details_time = (TextView) findViewById(R.id.news_details_time); news_details_progress = (ProgressBar) findViewById(R.id.news_details_progress); news_details_progress.setVisibility(0); news_details_title.setText(newstitle); news_details_time.setText(newstime); news_details_text.setTextSize(text_size); flag = 0; DataBaseHelper dbh = new DataBaseHelper(this, new IntToStrong().TypeToType(type), null, 1); SQLiteDatabase sql = dbh.getReadableDatabase(); Cursor cursor = sql.query(new IntToStrong().TypeToType(type), new String[] { "newsurl", "newstitle", "newstime", "newsdetails", "newsdownloadtext1", "newsdownloadurl1", "newsdownloadtext2", "newsdownloadurl2" }, "newsurl=?", new String[] { url }, null, null, null); cursor.moveToNext(); if (cursor.getCount() == 0) { new NewsThread().start(); } else { news_details_text.setText(cursor.getString(cursor .getColumnIndex("newsdetails"))); news_details_progress.setVisibility(8); } if (sql != null) { sql.close(); } } protected void putData() { DataBaseHelper dbh = new DataBaseHelper(this, new IntToStrong().TypeToType(type), null, 1); SQLiteDatabase sql = dbh.getWritableDatabase(); dbh.addetails(url, news_details_title.getText().toString(), news_details_time.getText().toString(), newsdetailstext, null, null, null, null); if (dbh != null) { dbh.close(); sql.close(); } } private void getNews() { try { String host = android.net.Proxy.getDefaultHost(); int port = android.net.Proxy.getDefaultPort(); Document doc = Jsoup.connect(url).get(); Element ele = doc.getElementById("TDContent"); int j = 1; if (ele.children().text().length() < 2) { System.out.println(1); newsdetailstext = newsdetailstext + ele.text(); } for (Element ele2 : ele.children()) { j++; newsdetailstext = newsdetailstext + ele2.text(); newsdetailstext = newsdetailstext + "\n"; newsdetailstext = newsdetailstext + "\n"; } if (j == 2) { newsdetailstext = ""; for (Element ele2 : ele.children()) { for (Element ele3 : ele2.children()) { System.out.println(3); newsdetailstext = newsdetailstext + ele3.text(); newsdetailstext = newsdetailstext + "\n"; newsdetailstext = newsdetailstext + "\n"; } } } } catch (Exception e) { e.printStackTrace(); } } private class NewsThread extends Thread { @Override public void run() { getNews(); Message msg = handler.obtainMessage(); msg.arg1 = 1; handler.sendMessage(msg); } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(menu.NONE, 1, 1, "字体大小"); menu.add(menu.NONE, 2, 1, "使用浏览器打开此页面"); menu.add(menu.NONE, 3, 1, "拨打此页面中电话"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Builder builder = new Builder(this); builder.setTitle("字体大小"); builder.setSingleChoiceItems(new String[] { "大", "中", "小" }, new IntToStrong().text_size_to_order(text_size), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == 0) { news_details_text.setTextSize(24); SharedPreferences sp = getSharedPreferences( "text_size", 0); sp.edit().putInt("text_size", 24).commit(); dialog.cancel(); } else if (which == 1) { news_details_text.setTextSize(20); SharedPreferences sp = getSharedPreferences( "text_size", 0); sp.edit().putInt("text_size", 20).commit(); dialog.cancel(); } else if (which == 2) { news_details_text.setTextSize(16); SharedPreferences sp = getSharedPreferences( "text_size", 0); sp.edit().putInt("text_size", 16).commit(); dialog.cancel(); } } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.show(); break; case 2: Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); break; case 3: Builder builder2=new Builder(this); Map telephone=getTelePhone(); //LayoutInflater inflater=getLayoutInflater(); //View layout=inflater.inflate(R.layout.telephone,(ViewGroup)findViewById(R.id.news_tele)); Intent intent1 = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+ telephone.get("tele"+1))); startActivity(intent1); //builder2.setView(layout); //builder2.show(); break; default: break; } return true; } private Map getTelePhone() { Map telephone = new HashMap<String, String>(); if (news_details_text.length() > 5) { int temp_index_telephone=1; String text = news_details_text.getText().toString(); for (int i = 1; i <= text.length() - 1; i++) { if (text.charAt(i) == '电' && text.charAt(i + 1) == '话' || text.charAt(i) == '电' && text.charAt(i + 2) == '话') { int k = 3; if(text.charAt(i+2)=='话'){ k=4; } String temp_telephone=""; while (text.charAt(i + k) == '1' || text.charAt(i + k) == '2' || text.charAt(i + k) == '3' || text.charAt(i + k) == '4' || text.charAt(i + k) == '5' || text.charAt(i + k) == '6' || text.charAt(i + k) == '7' || text.charAt(i + k) == '8' || text.charAt(i + k) == '9' || text.charAt(i + k) == '-' || text.charAt(i + k) == '0') { temp_telephone=temp_telephone+text.charAt(i+k); k++; } if(temp_telephone.length()>5){ temp_telephone=temp_telephone.replace("-",""); telephone.put("tele"+temp_index_telephone, temp_telephone); Log.i("sasaa", "" + temp_telephone); temp_index_telephone++; temp_telephone=""; } } } } return telephone; } }
关于监听多次触发的问题
求助各路大神 此处有一个登录验证的小程序,里面有个登录按钮设有监听,按钮监听里有一个验证函数,第一次跑程序,验证涵数没问题但如果第一次验证失败,当第二次触发监听后,验证数就会莫名其妙的跳过去,(我想可能和验证函数第一次返回NULL有关),如过真是这样,我该怎么样解决 监听位置位于LoadActivity.class中的 bt_load.setOnclickListener()内 ``` //登录函数 LoadActivity package cn.edu.nuc.skid_menu; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.content.DialogInterface; import java.util.List; import cn.edu.nuc.skid_menu.sqlite_utils.utils; /** * Created by Administrator on 2017/6/9. */ public class LoadActivity extends Activity{ private EditText met_name; private EditText met_pw; private Button bt_load; private Button bt_register; private cn.edu.nuc.skid_menu.sqlite_utils.utils utils; private List list; @Override protected void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_load); met_name = (EditText) findViewById(R.id.et_name); met_pw = (EditText) findViewById(R.id.et_pw); bt_load = (Button) findViewById(R.id.bt_load); bt_register = (Button) findViewById(R.id.bt_register); utils = new utils(LoadActivity.this); //String s= utils.execDate("delete from db_user where _id = ? ",new Object[]{"wsy123"});//增删改数据 //Log.i("wsy", s+""); utils.insert("wsy123","123456","male","运汽集团");//插入数据库 // utils.db.delete("db_user","_id = ?",new String[]{"wsy"});//删除数据 //utils.update();//更改数据 list = utils.selectAll(); utils.show_list(list);//显示数据库 Log.i("wsy", "分开!"); //String i ="wsy12345"; //List list1 = utils.select(i); //utils.show_list(list1); //显示_id为wsy12345的信息 // list = utils.select(met_name.getText().toString()); //!!!!!!!!就是这个监听!!!!!!!!!!!!!!!!!! bt_load.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("wsy", "触发登录监听"); String checkResult=checkInfo(); //!!!!!!!二次验证上面的函数checkInfo会被跳过!!!!!!! Log.i("wsy", "完成验证"); list = utils.select(met_name.getText().toString()); if(checkResult==null){ Intent intent=new Intent(LoadActivity.this,Main_activity.class); startActivity(intent); Log.i("wsy", "发送成功"); } else{ Log.i("wsy", "发送失败"); AlertDialog.Builder builder=new AlertDialog.Builder(LoadActivity.this); builder.setTitle("错误提示"); builder.setMessage(checkResult); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { met_pw.setText(""); met_name.setText(""); } }); builder.create().show(); } } }); bt_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(LoadActivity.this,RegisterActivity.class); startActivity(intent); } }); } private String checkInfo(){ if(met_name.getText().toString()==null||met_name.getText().toString().equals("")){ Log.i("wsy", "用户名不能为空!"); return "用户名不能为空"; } if(met_pw.getText().toString().trim().length()<6||met_pw.getText().toString().equals("")||met_pw.getText().toString().trim().length()>15){ Log.i("wsy", "密码长度为6-15位"); return "密码长度为6-15位"; } if(utils.select(met_name.getText().toString()).size()==0) { Log.i("wsy", "账号不存在"); return "账号不存在"; } if(!met_pw.getText().toString().trim().equals(utils.test_list(list).toString().trim())) { Log.i("wsy", "密码错误"); return "密码错误";} Log.i("wsy", "可以登录"); return null; } } //数据库管理工具 utils. package cn.edu.nuc.skid_menu.sqlite_utils; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.Cursor; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class utils extends SQLiteOpenHelper { SQLiteDatabase db = null; private final static String DBNAME = "db_user"; private final static int VERSION = 1; public utils(Context context) { super(context, DBNAME, null, VERSION); db = this.getReadableDatabase(); } public Cursor selectCursor(String sql, String[] selectionArgs) { return db.rawQuery(sql, selectionArgs); } public int selectCount(String sql, String[] selectionArgs) { Cursor cursor = db.rawQuery(sql, selectionArgs); int result = cursor.getCount(); if (cursor != null) { cursor.close(); } return result; } public List<Map<String, Object>> selectAll() { Log.i("wsy", "小成 1"); Cursor cursor = db.rawQuery("select * from db_user limit ?,? ", new String[]{"0", "999"}); Log.i("wsy", "小成2 "); return cursorToList(cursor); } public List<Map<String, Object>> select(String i) { Log.i("wsy", "成1"); String[] strings = {i}; Cursor cursor = db.query("db_user",new String[]{"_id","password","sex","school_name"},"_id =?",strings,null,null,"_id desc","0,5"); Log.i("wsy", "成2 "); return cursorToList(cursor); } public List<Map<String, Object>> cursorToList(Cursor cursor) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); while (cursor.moveToNext()) { Log.i("wsy", "有数据 "); Map<String, Object> map = new HashMap<String, Object>(); for (int i = 0; i < cursor.getColumnCount(); i++) { map.put(cursor.getColumnName(i), cursor.getString(i)); } list.add(map); } return list; } public String execDate(String sql, Object[] bindArgs) { try { db.execSQL(sql, bindArgs); return "成功"; } catch (Exception e) { return e.getMessage(); } } public void destroy() { if (db != null) { db.close(); } } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS db_user (_id VARCHAR(10) PRIMARY KEY ,password,sex,school_name)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { db.execSQL("DROP TABLE IF EXISTS db_users"); onCreate(db); } } public void show_list(List list) { Map map = null; String netMode1 = null; String netMode2 = null; String netMode3 = null; String netMode4 = null; for (int i = 0; i < list.size(); i++) { map = (HashMap) list.get(i); netMode1 = (String) map.get("_id"); if (netMode1 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "_id:" + netMode1); } netMode2 = (String) map.get("password"); if (netMode2 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "password:" + netMode2); } netMode3 = (String) map.get("sex"); if (netMode3 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "sex:" + netMode3); } netMode4 = (String) map.get("school_name"); if (netMode4 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "school_name:" + netMode4); } } } public void insert(String s1,String s2,String s3,String s4) { ContentValues values = new ContentValues(); values.put("_id", s1); values.put("password", s2); values.put("sex", s3); values.put("school_name", s4); long rowId = db.insert("db_user", null, values); } public void update() { ContentValues values = new ContentValues(); values.put("_id", "wsy"); values.put("password", "a123a123"); values.put("sex", "female"); values.put("school_name", "运气集团"); int result = db.update("db_user", values, "_id=?", new String[]{"wsy"}); } public SQLiteDatabase get_db(){ return db; } public String test_list(List list){ Map map = null; String netMode2 = null; map = (HashMap) list.get(0); netMode2 = (String) map.get("password"); return netMode2; } } //登录成功后的界面activity public class Main_activity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); Intent intent = getIntent(); } } //登录页面 activity_load.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.edu.nuc.skid_menu.LoadActivity" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="驾考通" android:textSize="40sp" android:layout_gravity="center" android:textColor="#00cc00" android:layout_marginTop="120dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一考就通" android:textSize="25sp" android:layout_marginRight="15dp" android:layout_gravity="right" android:textColor="#CC0000" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="账号 : " android:textSize="24sp" android:textColor="#000000" android:layout_marginLeft="15dp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/et_name" android:hint="请输入账号" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码 : " android:textSize="24sp" android:textColor="#000000" android:layout_marginLeft="15dp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/et_pw" android:hint="请输入密码" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" android:textColor="#000000" android:textSize="20sp" android:layout_marginTop="15dp" android:id="@+id/bt_load"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册" android:textColor="#000000" android:textSize="20sp" android:layout_marginTop="15dp" android:id="@+id/bt_register"/> </LinearLayout> </LinearLayout> //登录成功后的界面 Activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#6699ff" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="王绍阳,欢迎您" android:textSize="30sp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顺序刷题" android:layout_marginTop="40dp" android:textSize="30sp" android:id="@+id/bt_question" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="错题攻克" android:layout_marginTop="20dp" android:textSize="30sp" android:id="@+id/bt_dif_question" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改信息" android:layout_marginTop="20dp" android:textSize="30sp" android:id="@+id/bt_revise" /> </LinearLayout>
expandablelistview和checkbox结合使用,复用问题,头疼好几天,大神帮帮忙啊
了viewholder复用了,当子项滑出范围,选中的checkbox变为未选中,不过选中的删除时删除是正确的,只是这样重复选择(不知道怎么说),体验不好,头疼好几天了 expandablelistviewadapter代码如下: 关键代码: ``` /* * 解决复用问题的关键代码,那里好像出错了。导致自动让滑出屏幕的checkbox不选,这里 */ if (checkposition!=null) { itemHolder.cb.setChecked(checkposition.contains(itemHolder.cb.getText().toString())?true:false); } else{ itemHolder.cb.setChecked(false); } itemHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { String i = itemHolder.cb.getText().toString(); @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (!checkposition.contains(i)) { idlists.add(i); checkposition.add(i); } Fragment1.tv.setText("您已选中"+idlists.size()+"个联系人"); } else{ if (checkposition.contains(i)) { idlists.remove(i); checkposition.remove(i); } Fragment1.tv.setText("您已选中"+idlists.size()+"个联系人"); } } }); ``` 适配器完整代码: ``` package com.daisy.work.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.daisy.work.R; import com.daisy.work.atys.fragments.Fragment1; import com.daisy.work.db.ContactDB; public class MyExpandableListViewAdapter extends BaseExpandableListAdapter { private Context context; private Cursor cursor; private ArrayList<String> group_list; private ArrayList<List<Integer>> gr_list2; private ContactDB ctDB; private SQLiteDatabase dbRead; private ItemHolder itemHolder; public ArrayList<String> idlists; public List<String> checkposition; public MyExpandableListViewAdapter(Context context, Cursor cursor) { this.context = context; this.cursor = cursor;//cursor用来获取填充childview的数据 ctDB = new ContactDB(context); dbRead = ctDB.getReadableDatabase(); idlists = new ArrayList<String>();//用来记录checkboxbox的值,和数据库的name一列的值相同,便于删除 checkposition = new ArrayList<String>();//用来解决复用滑动错乱问题 group_list = new ArrayList<String>();//填充组 group_list.add("默认"); group_list.add("亲人"); group_list.add("同事"); group_list.add("同学"); group_list.add("客户"); List<Integer> gr_list = new ArrayList<Integer>(); gr_list.add(R.drawable.tree_ec); gr_list.add(R.drawable.tree_ec); gr_list.add(R.drawable.tree_ec); gr_list.add(R.drawable.tree_ec); gr_list.add(R.drawable.tree_ec); gr_list2 = new ArrayList<List<Integer>>();//{{1,2,3,4,5},{1,2,3,4,5}...} gr_list2.add(gr_list); gr_list2.add(gr_list); gr_list2.add(gr_list); gr_list2.add(gr_list); gr_list2.add(gr_list); } @Override public int getGroupCount() { return group_list.size(); } @Override public int getChildrenCount(int groupPosition) { String belong = group_list.get(groupPosition);//将特定的数据填充到分组中,用belong标识。 Cursor c = dbRead.query(ContactDB.CONTACT_TABLE_NAME, null, "belong like ?", new String[] { "%" + belong + "%" }, null, null, null); if (!c.moveToFirst()) { return 0; } else { return c.getCount(); } } @Override public Object getGroup(int groupPosition) { return group_list.get(groupPosition); } //多考虑一下 @Override public Object getChild(int groupPosition, int childPosition) { return getCombinedChildId(getGroupId(groupPosition),childPosition);//这个没搞太明白,填什么都不会出错 } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupHolder groupHolder = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.expendlist_group, null); groupHolder = new GroupHolder(); groupHolder.txt = (TextView) convertView.findViewById(R.id.txt); groupHolder.txt2 = (TextView) convertView.findViewById(R.id.txt2); groupHolder.img = (ImageView) convertView.findViewById(R.id.img); convertView.setTag(groupHolder); } else { groupHolder = (GroupHolder) convertView.getTag(); } if (!isExpanded) { groupHolder.img.setBackgroundResource(R.drawable.tree_ec); } else { groupHolder.img.setBackgroundResource(R.drawable.tree_ex); } String belong = group_list.get(groupPosition); cursor = dbRead.query(ContactDB.CONTACT_TABLE_NAME, null, "belong like ?", new String[] { "%" + belong + "%" }, null, null, null); int nm = cursor.getCount();//获取特定组中子项的数目。 groupHolder.txt.setText(group_list.get(groupPosition)); groupHolder.txt2.setText(nm + "");//显示组中子项的数目。 return convertView; } @Override public View getChildView(final int groupPosition,final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { itemHolder = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.expendlist_item,null); itemHolder = new ItemHolder(); itemHolder.ct_name = (TextView) convertView .findViewById(R.id.ct_name); itemHolder.ct_qq = (TextView) convertView.findViewById(R.id.ct_qq); itemHolder.iv = (ImageView) convertView.findViewById(R.id.iv); itemHolder.dial = (ImageButton) convertView.findViewById(R.id.dial); itemHolder.cb = (CheckBox) convertView.findViewById(R.id.cb); itemHolder.cb.setTag(itemHolder.cb.getText().toString());//child_item布局里的checkbox控件 convertView.setTag(itemHolder); } else { itemHolder = (ItemHolder) convertView.getTag(); } String belong = group_list.get(groupPosition); cursor = dbRead.query(ContactDB.CONTACT_TABLE_NAME, null, "belong like ?", new String[] { "%" + belong + "%" }, null, null, null); if (!cursor.moveToFirst()) { return null; } else { cursor.moveToPosition(childPosition); if (Fragment1.xs_bs.isShown()) {//按多选时将checkbox展现出啦,取消则隐藏xs_bs在adapter中无法获取,把它设为了public static itemHolder.cb.setChecked(false); itemHolder.cb.setVisibility(CheckBox.GONE); } else { itemHolder.cb.setVisibility(CheckBox.VISIBLE); itemHolder.dial.setOnClickListener(null); } if(Fragment1.qx.isPressed()){ //取消则隐藏 itemHolder.cb.setChecked(false); } //显示子项中的数据 itemHolder.ct_name.setText(cursor.getString(cursor .getColumnIndex("name"))); itemHolder.cb.setText(cursor.getString(cursor .getColumnIndex("name"))); itemHolder.ct_qq.setText(cursor.getString(cursor .getColumnIndex("qq"))); itemHolder.iv.setBackgroundResource(R.drawable.ic_ct); //按钮,由于其特殊性(在expandablelistview子项中的控件,在adapter中设置监听) itemHolder.dial.setOnClickListener(new View.OnClickListener() { String phone = cursor.getString(cursor.getColumnIndex("phone")); @Override public void onClick(View v) { context.startActivity(new Intent(Intent.ACTION_DIAL, Uri .parse("tel:" +phone))); } }); /* * 解决复用问题的关键代码,那里好像出错了。导致自动让滑出屏幕的checkbox不选,这里 */ if (checkposition!=null) { itemHolder.cb.setChecked(checkposition.contains(itemHolder.cb.getText().toString())?true:false); } else{ itemHolder.cb.setChecked(false); } itemHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { String i = itemHolder.cb.getText().toString(); @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (!checkposition.contains(i)) { idlists.add(i); checkposition.add(i); } Fragment1.tv.setText("您已选中"+idlists.size()+"个联系人"); } else{ if (checkposition.contains(i)) { idlists.remove(i); checkposition.remove(i); } Fragment1.tv.setText("您已选中"+idlists.size()+"个联系人"); } } }); return convertView; } } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } class GroupHolder { public TextView txt; public TextView txt2; public ImageView img; } class ItemHolder { public ImageView iv; public TextView ct_name; public TextView ct_qq; public ImageButton dial; public CheckBox cb; } } ``` ![图片说明](https://img-ask.csdn.net/upload/201605/16/1463356167_782724.png)
安卓应用开发,应用开启服务在后台运行,息屏一段时间后被关了,找原因和解决方案。
# 1.描述问题: 【用于科研,非商业】安卓应用开发,需要保持应用长时间运行获取定位信息,应用开启后启动Activity,然后启动Service,保持Service一直在后台运行。考虑到我们是请一些人帮忙装上应用的,所以主要是想让用户将应用添加到保护名单中,来保证应用正常运行时能够长不被清理掉。 【功能】Service做的事情包括:监听亮屏息屏、获取加速度传感器数据、调用百度SDK获取定位(由于GPS耗电量大,目前一直仅用wifi、基站等较低功耗的定位方式在测试)、操作SQLite数据库、Service中开启一个Thread每隔20s查询下数据库,数据足够量如10条时发送数据到服务器,handler回调。 【ps】Service持有了PARTIAL_WAKE_LOCK,CPU电源锁。 【服务保活】使用了:1.保持前台Notification;2.在手机中添加到加速白名单、应用后台保护,从而防住了锁屏几秒就被清理;3. 1像素保活; 【设备】华为荣耀7;型号PLK-TL01H;EMUI4.0.3;安卓6.0;运行内存3.0GB; # 2.相关代码: 无。 # 3.报错信息: 无报错,尝试过Crash时记录下信息,然后下次打开时传输到服务器以便查看crash信息,但是发现没有发送。(这个发送crash信息的功能经人为增加int i=1/0;测试过,能够获取到除数不为0的报错信息) # 4.尝试过的方法及反馈: **1.对比测试**: 1.1 连接电脑,不拔出usb线,一天都不会被退出; 1.2 拔出usb,应用退到后台,保持亮屏,应用大半天都没被退出; 1.3 拔出usb,应用退到后台,息屏,应用普遍半小时到两个多小时内,会被退出; 1.4 尝试过,后台边播放音乐来保活,应用退到后台,息屏,能听到音乐,应用长时间没被退出; **2.捕获Crash信息:** 测试并使用了捕获Crash信息然后发送到服务器,发现运行一段时间然后被退出的情况下,不会有crash信息被捕获; **3.思考OOM:** 在思考是否因OOM导致内存不足而退出应用,但是似乎不像是这个原因,理由如下:1.没有crash信息;2.连接usb线运行一天也没有发现OOM;3.保持亮屏时长时间也没有被退出; # 5.相关截图: 无。 # 6.提问及思考,求解疑: Q1.什么原因,会导致应用在连接usb或者直接亮屏时能够持续运行,而息屏后被退出却捕获不到crash信息? A1:似乎并非OOM,而是被系统清理掉。 Q2:以上表现是否验证了“应用被系统清理掉”的假设?如果是被系统清理掉,那么能导致被系统清理掉的原因有哪些(梳理总结)? A2:当前觉得,是否是因为耗电量太大,导致应用会运行一段时间后被清理?并且这种清理是添加到内存加速白名单、应用后台保护,后仍然会生效的、能够清掉应用的?
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问