关于android APP开发中SQLITE数据库的问题

代码如下,首先请问我写的这段创建数据库的代码有没有错误?然后把这个类的文件放在哪里才对啊,目前程序一打开就是程序已经停止运行,APP的第一个ACTIVITY我设置的就是判断这个库中的某个表中有没有数据。我现在感觉就是程序打开,这个库还没有创建,是不存在的,所以运行不了。请大神指教下我。或者说怎么让APP一开始运行的第一步就是运行以下的代码来创建这个数据库。求指教。

//数据库创建类
package com.captain.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class Db_create extends SQLiteOpenHelper {
private static final int VERSION=1; //数据库版本号定义
private static final String DBN="manager.db";
public Db_create(Context context)
{
super(context,DBN,null,VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table tb_MoneyIn(_id integer primary key,user varchar(20)," +
"money decimal,time varchar(10),type varchar(10),person varchar(100),mark varchar(200))");
db.execSQL("create table tb_MoneyOut(_id integer primary key,user varchar(20)," +
"money decimal,time varchar(10),type varchar(10),person varchar(100),mark varchar(200))");
db.execSQL("create table tb_Users(_user integer primary key,pwd varchar(20))");
db.execSQL("create table tb_BianQian(_id integer primary key,user varchar(20)," +
"content varchar(200))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}

2个回答

我公司屏蔽qq了,你加我微信t_523474087

程序停止运行的错误点应该不在此文件中,应该是你ACTIVITY中判断的时候出现错误,应该先判断有没有数据库文件,然后才判断次数据库中表中有没有数据
最后将程序崩溃的log附加上

qq_31190231
qq_31190231 。。。网络延迟了,发了好多
大约 4 年之前 回复
qq_31190231
qq_31190231 。。。网络延迟了,发了好多
大约 4 年之前 回复
qq_31190231
qq_31190231 恩!找到问题了,确实是我ACT中那个判断条件的问题,我改了一下判断的语句就好了。但是我还有一些问题现在,能不能留个联系方式给我,你加我QQ可以吗?
大约 4 年之前 回复
qq_31190231
qq_31190231 恩!找到问题了,确实是我ACT中那个判断条件的问题,我改了一下判断的语句就好了。但是我还有一些问题现在,能不能留个联系方式给我,你加我QQ可以吗?
大约 4 年之前 回复
qq_31190231
qq_31190231 恩!找到问题了,确实是我ACT中那个判断条件的问题,我改了一下判断的语句就好了。但是我还有一些问题现在,能不能留个联系方式给我,你加我QQ可以吗?
大约 4 年之前 回复
qq_31190231
qq_31190231 恩!找到问题了,确实是我ACT中那个判断条件的问题,我改了一下判断的语句就好了。但是我还有一些问题现在,能不能留个联系方式给我,你加我QQ可以吗?
大约 4 年之前 回复
qq_31190231
qq_31190231 恩!找到问题了,确实是我ACT中那个判断条件的问题,我改了一下判断的语句就好了。但是我还有一些问题现在,能不能留个联系方式给我,你加我QQ可以吗?
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android APP怎么获取sqlite3数据库数据

Android APP怎么获取sqlite3数据库数据,哪位大神教教我

您是怎么看待服务器端数据库和android应用本地sqlite数据库

一个线上的应用(比如说网易新闻)肯定是要跟服务器打交道的,但是当用户处于网络离线情况下,还能继续观看新闻(就是所谓的离线新闻),那么这些新闻数据肯定要保存在本地数据库(也有人说用json保存到文件里),那现在就有这样一个事情了.是不是有网就去服务器取数据,然后将取到的数据保存到本地的数据库(含数据更新),有些设置得更人性化的应用,还分是否2G/3G/wifi状态下读取服务器的数据. 服务器端数据库和本地数据库频繁的切换,是不是有点烦呢? 以上就是我的个人设想.如果您有更好的见解,请给我一条光明的道路指引吧.......

Android如何判断SQLite数据库已经存在或不存在

第一次运行APP时,按钮的点击事件会创建SQLite数据库。此后退出系统,然后再重新运行时,(1)如何判断 数据库已经存在,就不创建数据库。(2)如何判断数据库不存在,就创建数据库

运行 SQLite 数据库后程序崩溃

我设计的是查询数据库后下面的程序段返回一个数组。但是现在运行下面的程序时,奔溃了 //info 是类型数据中对象的名字 info.open(); String[] data = info.queryAll(); info.close(); 数据库代码部分,我想检索某一列中所有数据库的行 public String[] queryAll() { String[] columns = new String[] { KEY_NAME }; Cursor cursor = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); if (cursor != null) { try { final int nameColumnIndex = cursor.getColumnIndex(KEY_NAME); List<String> names = new ArrayList<String>(); while (cursor.moveToNext()) { names.add(cursor.getString(nameColumnIndex)); } return names.toArray(new String[names.size()]); } finally { cursor.close(); } } return null; } 是因为数据库刚开始是空的吗? LOGCAT 04-23 22:26:47.780: E/AndroidRuntime(2825): FATAL EXCEPTION: main 04-23 22:26:47.780: E/AndroidRuntime(2825): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.contactlist/com.example.contactlist.Contacts}: android.database.sqlite.SQLiteException: no such table: mycontacts (code 1): , while compiling: SELECT Contact_name FROM mycontacts 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread.access$600(ActivityThread.java:130) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.os.Handler.dispatchMessage(Handler.java:99) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.os.Looper.loop(Looper.java:137) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread.main(ActivityThread.java:4745) 04-23 22:26:47.780: E/AndroidRuntime(2825): at java.lang.reflect.Method.invokeNative(Native Method) 04-23 22:26:47.780: E/AndroidRuntime(2825): at java.lang.reflect.Method.invoke(Method.java:511) 04-23 22:26:47.780: E/AndroidRuntime(2825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 04-23 22:26:47.780: E/AndroidRuntime(2825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 04-23 22:26:47.780: E/AndroidRuntime(2825): at dalvik.system.NativeStart.main(Native Method) 04-23 22:26:47.780: E/AndroidRuntime(2825): Caused by: android.database.sqlite.SQLiteException: no such table: mycontacts (code 1): , while compiling: SELECT Contact_name FROM mycontacts 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 04-23 22:26:47.780: E/AndroidRuntime(2825): at com.example.contactlist.DBContact.queryAll(DBContact.java:97) 04-23 22:26:47.780: E/AndroidRuntime(2825): at com.example.contactlist.Contacts.onCreate(Contacts.java:38) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.Activity.performCreate(Activity.java:5008) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 04-23 22:26:47.780: E/AndroidRuntime(2825): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 04-23 22:26:47.780: E/AndroidRuntime(2825): ... 11 more

Android如何将SQLite数据库中的数据导出为csv格式的文件

搜到了下边这个方法,但是我没实现功能,请各位指教。最好能有代码 public void ExportToCSV(Cursor c, String fileName) { int rowCount = 0; int colCount = 0; FileWriter fw; BufferedWriter bfw; File sdCardDir = Environment.getExternalStorageDirectory(); File saveFile = new File(sdCardDir, fileName); try { rowCount = c.getCount(); colCount = c.getColumnCount(); fw = new FileWriter(saveFile); bfw = new BufferedWriter(fw); if (rowCount > 0) { c.moveToFirst(); // 写入表头 for (int i = 0; i < colCount; i++) { if (i != colCount - 1) bfw.write(c.getColumnName(i) + ','); else bfw.write(c.getColumnName(i)); } // 写好表头后换行 bfw.newLine(); // 写入数据 for (int i = 0; i < rowCount; i++) { c.moveToPosition(i); // Toast.makeText(mContext, "正在导出第"+(i+1)+"条", // Toast.LENGTH_SHORT).show(); Log.v("导出数据", "正在导出第" + (i + 1) + "条"); for (int j = 0; j < colCount; j++) { if (j != colCount - 1) bfw.write(c.getString(j) + ','); else bfw.write(c.getString(j)); } // 写好每条记录后换行 bfw.newLine(); } } // 将缓存数据写入文件 bfw.flush(); // 释放缓存 bfw.close(); // Toast.makeText(mContext, "导出完毕!", Toast.LENGTH_SHORT).show(); Log.d("导出数据", "导出完毕!"); Toast.makeText(SecondActivity.this, "默认Toast样式", Toast.LENGTH_SHORT).show(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { c.close(); } }

AndroidStudio开发APP 用本地SQlite实现登陆,但账号密码全是0?

实现登陆功能时,无法用本地自己用SQlite创建的数据库,只能输入账号密码全为0才能登进去,自己的数据库中的账号密码根本不被调用,这是怎么回事? 求大佬告知

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这个框架怎么设置就抓瞎了。

Android SQLite获取数据库写入对象出错

![图片说明](https://img-ask.csdn.net/upload/201706/08/1496909254_123024.png) java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:304) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.howso.cqt/databases/cqt.db' to 'en_US'. at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:393) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1163) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:278) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at com.howso.cqt.db.cqt.CQTManager.writeDB(CQTManager.java:108) at com.howso.cqt.db.cqt.CQTManager.addSignalEvents(CQTManager.java:491) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:3560) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) ... 4 more Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555) at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:371) ... 22 more android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.howso.cqt/databases/cqt.db' to 'en_US'. at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:393) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1163) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:278) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at com.howso.cqt.db.cqt.CQTManager.writeDB(CQTManager.java:108) at com.howso.cqt.db.cqt.CQTManager.addSignalEvents(CQTManager.java:491) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:3560) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555) at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:371) ... 22 more android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555) at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:371) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1163) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:278) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at com.howso.cqt.db.cqt.CQTManager.writeDB(CQTManager.java:108) at com.howso.cqt.db.cqt.CQTManager.addSignalEvents(CQTManager.java:491) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:3560) at com.howso.cqt.activity.indoortest.oldIndoorDicActivity$SaveAsync.doInBackground(oldIndoorDicActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818)

SQLite数据库问题,无论怎么安装都有问题

本人在实验SQLite数据库,代码在Eclipse上面没问题,一到手机上面安装就有问题,手机是三星自带androi5.0.1系统 代码如下:package com.example.sqltest; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity{ Button b,b1; TextView t1; myDatabaseHelper myHelp; SQLiteDatabase mydb=myHelp.getReadableDatabase(); String sql="select * from newsif"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b=(Button)findViewById(R.id.b); b1=(Button)findViewById(R.id.b1); t1=(TextView)findViewById(R.id.text2); myHelp=new myDatabaseHelper(this,"myDict.db3",1); b.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub insertData(myHelp.getReadableDatabase(),"1500","2012-12-12"); Toast.makeText(MainActivity.this, "数据插入成功",Toast.LENGTH_SHORT).show(); } }); b1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(myHelp.getReadableDatabase()!=null){ Toast.makeText(MainActivity.this, "数据库打开或者创建成功", Toast.LENGTH_SHORT).show(); Cursor cursor=mydb.rawQuery(sql, null); String text=""; while(cursor.moveToFirst()) { text=cursor.getString(cursor.getColumnIndex("data"))+" " +cursor.getString(cursor.getColumnIndex("time")); } t1.append(text); } } }); } private void insertData(SQLiteDatabase db ,String word,String detail){ db.execSQL("insert into dict values(?,?)", new String[]{word,detail}); } @Override public void onDestroy(){ super.onDestroy(); if(myHelp!=null) { myHelp.close(); } } } 错误提示如下 ![图片说明](https://img-ask.csdn.net/upload/201603/31/1459417909_567153.jpg)

使用Android中的SQLite建立一个数据库,加了一张Book表,增加一个表,升级数据库失败

使用Android中的SQLite建立一个数据库BookStore,加了一张Book表,然后我要增加一个Category表,按照《第一行代码》中的6.4.2所示代码写完后,点击App后直接闪退。(我用的是Andro Studio3.1版本,使用真机开发,系统Androi8.1)。代码如下 主活动代码: public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2); Button createDatabase=(Button)findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } } 定义一个数据库类MyDatabaseHelper继承SQLiteOpenHelper public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK="create table Book(" +"id integer primary key autoincrement," +"author text" +"price real" +"pages integer" +"name text)"; public static final String CREATE_CATEGORY="create table Category(" +"id integer primary key autoincrement" +"category_name text" +"category_code integer)"; private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); mContext=context; } @Override public void onCreate(SQLiteDatabase db){ db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){ db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }

将Android应用程序的数据库与Web服务器数据库同步

<div class="post-text" itemprop="text"> <p>I am a noob in android development, I developed an android application using sqlite database. I have same application on web server in php using mysql database. I want to sync the changes of whole database(including all six tables) on web server with my android app database. How do I do it? I need to know how do i check if there is some updation in web server database and if there is some updation then how do i get those updations to my android database automatically.</p> <p>Is there a way to do it without GCM and SyncAdapter?</p> </div>

不能打开 SQLite 数据库

我使用下面的代码打开 SQLite 数据库: dbHelper = new DataBaseHelper(context); public static void open() throws SQLException { try { database = dbHelper.getWritableDatabase(); } catch (Exception e) { e.printStackTrace(); Log.d(Tag.getTag("open()"), "Can't open db"); } } 但是获得 NullPointerException 异常。下面是 DataBaseHelper 类 //declarations and stuff public DataBaseHelper(Context context) { super(context, VFS_DATABASE_NAME, null, DATABASE_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub Toast.makeText(context, "Creating DataBase for first time...", 2000).show(); db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(DataBaseHelper.class.getName(), "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS" + VFS_DATABASE_TABLE); onCreate(db); } 我找不出哪里出错。这个错误是如何发生的呢? 堆栈跟踪: 02-20 23:16:07.698: W/System.err(4685): java.lang.NullPointerException 02-20 23:16:07.698: W/System.err(4685): at com.manager.boot.r1223.VSDataSource.open(VSDataSource.java:34) 02-20 23:16:07.698: W/System.err(4685): at com.manager.boot.r1223.VSDataSource.ScanVirtualSystems(VSDataSource.java:52) 02-20 23:16:07.706: W/System.err(4685): at com.manager.boot.r1223.OSListActivity.onCreate(OSListActivity.java:49) 02-20 23:16:07.706: W/System.err(4685): at android.app.Activity.performCreate(Activity.java:4465) 02-20 23:16:07.706: W/System.err(4685): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-20 23:16:07.706: W/System.err(4685): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 02-20 23:16:07.706: W/System.err(4685): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 02-20 23:16:07.706: W/System.err(4685): at android.app.ActivityThread.access$600(ActivityThread.java:123) 02-20 23:16:07.706: W/System.err(4685): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 02-20 23:16:07.706: W/System.err(4685): at android.os.Handler.dispatchMessage(Handler.java:99) 02-20 23:16:07.706: W/System.err(4685): at android.os.Looper.loop(Looper.java:137) 02-20 23:16:07.706: W/System.err(4685): at android.app.ActivityThread.main(ActivityThread.java:4424) 02-20 23:16:07.706: W/System.err(4685): at java.lang.reflect.Method.invokeNative(Native Method) 02-20 23:16:07.706: W/System.err(4685): at java.lang.reflect.Method.invoke(Method.java:511) 02-20 23:16:07.706: W/System.err(4685): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 02-20 23:16:07.706: W/System.err(4685): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 02-20 23:16:07.706: W/System.err(4685): at dalvik.system.NativeStart.main(Native Method)

对于SQLite数据库在Android中 如果我写一个便签程序 是对SQL数据库进行增删改查吗

对于Android 中的数据库 ,Sqlite 它的轻量级 一般用于什么上 哪些日常app用到了它 谢谢 I'm a rookie.

关于android的 sqlite初始化的问题

我想做一个android 单机版的模拟考试app ,想把考题就放到sqlite数据库中。 怎么办才能装上安装app的时候 ,就生成一个有数据的sqlite数据库

这个利用sqlite写的数据库为什么退出应用后再进去数据库就无法找到了啊

package com.sample.Sample_8_4; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class Sample_8_4 extends Activity { private Button baseButton; private Button tableButton; private Button btn_sqlmod, btn_cvmod, btn_qur; private final String dbName = "mydb"; private final String tableName = "users"; private SQLiteDatabase db = null; private int i = 1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); baseButton = (Button) findViewById(R.id.base); // 实例化Button对象 baseButton.setOnClickListener(new OnClickListener() { // 为Button对象添加监听 public void onClick(View v) { db = openOrCreateDatabase(dbName, MODE_PRIVATE, null); // 创建名为“mydb”的数据库 db.endTransaction(); Toast.makeText(getApplicationContext(), "创建数据库成功", 1000) .show(); } }); tableButton = (Button) findViewById(R.id.table); // 实例化Button对象 tableButton.setOnClickListener(new OnClickListener() { // 为Button对象添加监听 public void onClick(View v) { if (db != null) { creatTable(); // 开始创建数据库表 } else { Toast.makeText(getApplicationContext(), "没有数据库", 1000).show(); } } }); btn_sqlmod = (Button) findViewById(R.id.sql_mod); btn_sqlmod.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (db != null) { sql_executeData(); } else { Toast.makeText(getApplicationContext(), "没有数据库", 1000) .show(); } } }); btn_cvmod = (Button) findViewById(R.id.cv_mod); btn_cvmod.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (db != null) { cv_executeData(); } else { Toast.makeText(getApplicationContext(), "没有数据库", 1000) .show(); } } }); btn_qur = (Button) findViewById(R.id.que); btn_qur.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (db != null) { queryData(); } else { Toast.makeText(getApplicationContext(), "没有数据库", 1000) .show(); } } }); } public void creatTable() { // 创建表的SQL语句,创建一个名为users的表,该表有id,uname和pwd三个字段 String sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (id INTEGER PRIMARY KEY AUTOINCREMENT, uname VARCHAR(50), pwd VARCHAR(50));"; db.execSQL(sql); // 执行sql语句 db.endTransaction(); // 查询sqlite_master表中类型为table的记录的name字段 Cursor cursor = db.query("sqlite_master", new String[] { "name" }, "type = ?", new String[] { "table" }, null, null, null, null); String tables = ""; if (cursor.getCount() != 0) { // 判断查询结果的条数是否为0 cursor.moveToFirst(); // 游标指向第一条记录 for (int i = 0; i < cursor.getCount(); i += 1) { tables = tables + cursor.getString(0) + " "; // 累加字符串 cursor.moveToNext(); // 游标下移 } } // 把累加的结果显示在一个信息框中 new AlertDialog.Builder(Sample_8_4.this).setTitle("Message") .setMessage(tables) .setNegativeButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } public void sql_executeData() { String sql; for (; i < 4; i++) { sql = "insert into " + tableName + " values ('" + i + "','a','123456')"; // 添加一条记录 db.execSQL(sql); db.endTransaction(); } sql = "update " + tableName + " set pwd='654321' where id='1'"; // 修改一条记录 db.execSQL(sql); db.endTransaction(); sql = "delete from " + tableName + " where id='2'"; // 删除一条记录 db.execSQL(sql); db.endTransaction(); Toast.makeText(getApplicationContext(), "使用SQL语句修改数据成功", 1000).show(); } public void cv_executeData() { ContentValues cv = new ContentValues(); // 实例化ContentValues对象 cv.put("uname", "b"); // 插入字段值 cv.put("pwd", "987654"); // 插入字段值 db.insert(tableName, null, cv); // 执行insert方法 db.insert(tableName, null, cv); // 执行insert方法 db.insert(tableName, null, cv); // 执行insert方法 cv = new ContentValues(); // 实例化ContentValues对象 cv.put("pwd", "456789"); // 插入字段值 db.update(tableName, cv, "id=?", new String[] { "4" }); // 执行update方法 db.delete(tableName, "id=?", new String[] { "5" }); // 执行delete操作 Toast.makeText(getApplicationContext(), "使用Android语句修改数据成功", 1000) .show(); } public void queryData() { Cursor cursor = db.query(tableName, null, null, null, null, null, null, null); // 执行query操作获得Cursor对象 String str = ""; if (cursor.getCount() != 0) { // 判断返回的记录条数 cursor.moveToFirst(); // 游标指向第一条记录 for (int i = 0; i < cursor.getCount(); i += 1) { str = str + cursor.getString(0) + " " + cursor.getString(1) + " " + cursor.getString(2) + "\n"; // 获取一条记录的每个字段的值 cursor.moveToNext(); // 游标指向下一条记录 } } // 在信息框上显示所有记录信息 new AlertDialog.Builder(Sample_8_4.this).setTitle("Message") .setMessage(str) .setNegativeButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } }

android 中 sqlite 一般用来干什么?

做过几个APP,但是很少用到sqlite ,所以想请教各位大神,我们一般在什么时候会用到 sqlite呢,用来保存些什么信息,。。

sqlite数据库文件读取不到

有人遇见过这样的问题吗,一个项目在eclipse里运行就能读取到设备的数据库文件,在android studio里运行就读取不到,报not an error (code 0): Could not open the database in read/write mode.确定权限已添加,而且是同一个设备所以该文件一定是存在的。

Android获取SQLite里面的本地音乐清单

编写音乐播放器的时候在写获取SQLite里面的本地音乐清单时遇到如下这个异常: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.musicplayer/com.example.musicplayer.activity.Inventory}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference 下面是我的获取SQLite里面的本地音乐清单的代码类 public class Locality extends Activity { public List<Map<String, Object>> getCatalog() { Cursor mAudioCursor = this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, // 查询条件 null, // 条件的对应?的参数 MediaStore.Audio.AudioColumns.TITLE);// 排序方式 List<Map<String, Object>> mListData = new ArrayList<Map<String, Object>>(); for (int i = 0; i < mAudioCursor.getCount(); i++) { mAudioCursor.moveToNext(); // 找到歌曲标题和总时间对应的列索引 int indexTitle = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);// 歌名 int indexARTIST = mAudioCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);// 艺术家 /* * int indexALBUM = mAudioCursor * .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);//专辑 */ String strTitle = mAudioCursor.getString(indexTitle); String strARTIST = mAudioCursor.getString(indexARTIST); /* String strALBUM = mAudioCursor.getString(indexALBUM); */ HashMap<String, Object> nowMap = new HashMap<String, Object>(); nowMap.put("SongName", strTitle); nowMap.put("SongMessage", strARTIST); mListData.add(nowMap); } return mListData; } } 提示我是这一行出错: Cursor mAudioCursor = this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,// 字段 没有字段 就是查询所有信息 相当于SQL语句中的 “ // * ” null, // 查询条件 null, // 条件的对应?的参数 MediaStore.Audio.AudioColumns.TITLE);// 排序方式

android使用sqlite遇到一个问题

![图片说明](https://img-ask.csdn.net/upload/201704/17/1492412994_714767.jpg) 如上图所示,我创建了一个数据库,在软件刚安装时是可以创建和写入的,但是退出软件后,第二次使用,就不能够使用这个数据库了,写入不了数据。怎么解决。

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐