数据库创建以及原始方式操作数据库

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity" ><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click1"android:text="add" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click2"android:text="delete" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click3"android:text="update" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click4"android:text="find" /></LinearLayout>

MyOpenHelper.java

package com.example.sqlite2;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {/*** @param context 上下文* @param name 数据库的名字* @param factory 创建cursor对象(就是游标也即结果集)* @param version 数据库的版本* */public MyOpenHelper(Context context) {super(context, "itheima.db", null, 3);}/*** 数据库第一创建时调用* 特别适合做表格结构的初始化  * 那么可得此方法就是写创建表的sql语句的*/@Overridepublic void onCreate(SQLiteDatabase db) {//1. sqlite的id一般写成 "_id"//2. 数据类型统一为String 写了和没写一样 为何和数据库程序员融洽对接以及增加可读性 企业还是要求规范写db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20))");}/*** 数据库版本升级时调用* 适合于更新表结构*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("alter table info add phone varchar(20)");}}

MainActivity.java

package com.example.sqlite2;import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {private MyOpenHelper helper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);helper = new MyOpenHelper(getApplicationContext());//打开或者创建数据库 第一次创建//SQLiteDatabase writableDatabase = helper.getWritableDatabase();//打开或者创建数据库 第一次创建 若磁盘满 返回一个只读的
//        SQLiteDatabase readableDatabase = helper.getReadableDatabase();}//点击按钮增加一条记录public void click1(View v){//[1]获取数据库对象SQLiteDatabase db = helper.getWritableDatabase();//[2]执行增加一条记录的sql语句db.execSQL("insert into info(name,phone) values(?,?);",new Object[]{"张三","14575651"});//[3]数据库用完关闭db.close();}//删除public void click2(View v){SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("delete from info where name=?;", new Object[]{"张三"});db.close();}//更新public void click3(View v){SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("update info set phone=? where name=?;", new Object[]{"110120","张三"});db.close();}//查询public void click4(View v){SQLiteDatabase db = helper.getReadableDatabase();//获取游标  即结果集Cursor cursor = db.rawQuery("select * from info;", null);if(cursor.getCount()<=0){Toast.makeText(this, "数据库空", 0).show();return;}StringBuffer ans=new StringBuffer();//一行一行获取数据while(cursor.moveToNext()){//编号重0开始  0是id不取String name = cursor.getString(1);String phone = cursor.getString(2);ans.append("\nname:"+name+"   phone:"+phone);}Toast.makeText(this,ans, 0).show();}}

小结1

容易进行多表查询

命令行访问sqlite数据库

adb shell
cd data/data
ls
cd com.example.sqlite2
ls
cd databases
ls
sqlite3 itheima.db
select * from info;

提示:sqlite3: not found
需要下载安装sqlite3工具

★改变dos窗口的编码(解决某些乱码)

改为gbk:  chcp 936

改为u8: chcp 65001

使用api进行crud

有诸多好处,但写起来特别复杂,不如直接写sql语句

MainActivity.java

package com.example.sqlite2;import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import com.example.crud.R;public class MainActivity extends Activity {private MyOpenHelper helper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);helper = new MyOpenHelper(getApplicationContext());//打开或者创建数据库 第一次创建//SQLiteDatabase writableDatabase = helper.getWritableDatabase();//打开或者创建数据库 第一次创建 若磁盘满 返回一个只读的
//        SQLiteDatabase readableDatabase = helper.getReadableDatabase();}//点击按钮增加一条记录public void click1(View v){//[1]获取数据库对象SQLiteDatabase db = helper.getWritableDatabase();//[2]执行增加一条记录的sql语句//db.execSQL("insert into info(name,phone) values(?,?);",new Object[]{"张三","14575651"});/*** db.insert(table, nullColumnHack, values)* * table:表名* values:ContentValues类内封装一个map  key:列名   value:插入的值*/ContentValues values=new ContentValues();values.put("name", "王五");values.put("phone", "110");//返回值为插入新行的idlong insert = db.insert("info", null, values);//insert底层就在封装sql语句//[3]数据库用完关闭db.close();if(insert>0){Toast.makeText(getApplicationContext(), "添加成功!", 0).show();}else{Toast.makeText(getApplicationContext(), "添加失败!", 0).show();}}//删除public void click2(View v){SQLiteDatabase db = helper.getWritableDatabase();//db.execSQL("delete from info where name=?;", new Object[]{"张三"});/*** db.delete(table, whereClause, whereArgs)* * table:所删表名* whereClause:删除条件* whereArgs: 参数   注意是new String[]{}* * 返回值:影响的行数*/int delete = db.delete("info", "name=?", new String[]{"王五"});db.close();Toast.makeText(getApplicationContext(), "删除了"+delete+"行!", 0).show();}//更新public void click3(View v){SQLiteDatabase db = helper.getWritableDatabase();//db.execSQL("update info set phone=? where name=?;", new Object[]{"110120","张三"});/*** db.update(table, values, whereClause, whereArgs)* * table:表名* values:ContentValues  key:修改的列名   values:新的列值* whereClause:条件* whereArgs:参数* 返回值:更新了多少行*/ContentValues values=new ContentValues();values.put("phone", "114"); int update = db.update("info", values, "name=?", new String[]{"王五"});db.close();Toast.makeText(getApplicationContext(), "更新了"+update+"行!", 0).show();}//查询public void click4(View v){SQLiteDatabase db = helper.getReadableDatabase();//获取游标  即结果集//Cursor cursor = db.rawQuery("select * from info;", null);/*** db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)* 见名识义* columns:String[]  要查询的列名   null代表查询所有* selection: 查询条件* selectionArgs: 查询参数* groupBy:分组条件* having: 过滤条件* orderBy:排序条件* * eg:db.query("info",new String[]{"phone"},"name=?",new String[]{"王五"},null,null,null);*/Cursor cursor = db.query("info",new String[]{"phone"},"name=?",new String[]{"王五"},null,null,null);if(cursor.getCount()<=0){Toast.makeText(this, "数据库空", 0).show();return;}StringBuffer ans=new StringBuffer();//一行一行获取数据while(cursor.moveToNext()){//编号重0开始 注意此时只查询一列 phone就是0String phone = cursor.getString(0);ans.append("\nphone:"+phone);}Toast.makeText(this,ans, 0).show();}}

Android事务模板(转账)

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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=".MainActivity" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView1"android:layout_below="@+id/textView1"android:layout_marginLeft="29dp"android:layout_marginTop="80dp"android:onClick="click"android:text="转账" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/button1"android:layout_below="@+id/button1"android:layout_marginTop="125dp"android:onClick="click2"android:text="查询" /></RelativeLayout>

MyOpenHelper.java

package com.example.transaction;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "Account", null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20),account varchar(20))");db.execSQL("insert into info(name,phone,account) values('张三','110','3000')");db.execSQL("insert into info(name,phone,account) values('李四','120','3000')");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

MainActivity.java

package com.example.transaction;import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {private SQLiteDatabase db;private SQLiteDatabase db2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());db = myOpenHelper.getWritableDatabase();db2 = myOpenHelper.getReadableDatabase();}public void click(View v) {db.beginTransaction();//开启事务try {db.execSQL("update info set account=account-100 where name=?",new String[] { "张三" });int i=1/0;db.execSQL("update info set account=account+100 where name=?",new String[] { "李四" });// 未发生异常会执行到此行,也就会帮你提交// 发生异常就不会执行到此行,自动回滚db.setTransactionSuccessful();Toast.makeText(getApplicationContext(), "转账成功!", 0).show();} catch (Exception e) {Toast.makeText(getApplicationContext(), "服务器忙,请稍后再试试~~", 0).show();} finally {db.endTransaction();//关闭事务}}//查询所有public void click2(View v) {Cursor cursor = db2.rawQuery("select name,phone,account from info",null);StringBuffer sb = new StringBuffer();while (cursor.moveToNext()) {sb.append(cursor.getString(0) + "\t" + cursor.getString(1) + "\t"+ cursor.getString(2) + "\n");}Toast.makeText(getApplicationContext(), sb, 0).show();}
}

ListView控件入门

activity_main.xml里写一个文件,MainActivity.java里用java代码布局显示内容

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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=".MainActivity" ><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></RelativeLayout>

MainActivity.java

package com.example.listview;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[1]找到关心的控间ListView lv = (ListView) findViewById(R.id.lv);//[2]显示数据 textview和其他普通控件有点区别 它的数据来源于数据适配器lv.setAdapter(new MyListAdapter());}/*** 初始化布局代码* @author Administrator**///[3] 定义listview的数据适配器private class MyListAdapter extends BaseAdapter{//一共显示多少条目@Overridepublic int getCount() {return 100;}//返回指定position(重0开始)处的对象  用默认即可@Overridepublic Object getItem(int position) {return null;}//返回position位置对应的id@Overridepublic long getItemId(int position) {return 0;}/*** 获取一个view  用来显示listview的数据 会作为listview的一个条目出现* 每条显示多少*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView tv=new TextView(MainActivity.this);tv.setText("哈哈哈"+position);return tv;}}
}

ListView优化

布局加滚动条

items采用复用技术,使得大大节省内存,也绝对不会内存溢出

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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=".MainActivity" ><ListViewandroid:id="@+id/lv"android:fastScrollEnabled="true"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></RelativeLayout>

MainActivity.java

package com.example.listview;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[1]找到关心的控间ListView lv = (ListView) findViewById(R.id.lv);//[2]显示数据 textview和其他普通控件有点区别 它的数据来源于数据适配器lv.setAdapter(new MyListAdapter());}/*** 初始化布局代码* @author Administrator**///[3] 定义listview的数据适配器private class MyListAdapter extends BaseAdapter{//一共显示多少条目@Overridepublic int getCount() {return 1000;}//返回指定position(重0开始)处的对象  用默认即可@Overridepublic Object getItem(int position) {return null;}//返回position位置对应的id@Overridepublic long getItemId(int position) {return 0;}/*** 获取一个view  用来显示listview的数据 会作为listview的一个条目出现* 每条显示多少*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {
//          System.out.println("listview"+position);//说明界面上显示一条才调用一次本方法
//          TextView tv=new TextView(MainActivity.this);//每次都new 内存不够快速拖拽,前面的没来得及释放就会内存溢出TextView tv;//简简单单的判断保证快速滑动也不会卡死  复用使得只用创建一屏能显示的条目数个tv就行了if(convertView==null){tv=new TextView(MainActivity.this);System.out.println("创建view对象---"+position);}else{System.out.println("复用历史缓存对象---"+position);tv=(TextView) convertView;}tv.setText("哈哈哈"+position);return tv;}}
}

奇怪现象

listview布局中的android:layout_height="match_parent"   都写match_parent  不要用wrap_content

都这么写:

<ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"/>

包裹内容就无法确定高度,也就无法准确计算出一屏一共需要new出多少个items就会多次尝试最终new出很多多余的item,效率会低点

listview练习复杂布局

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><ListViewandroid:id="@+id/lv"android:fastScrollEnabled="true"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_marginTop="10dp"android:layout_width="match_parent"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/iv_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/pci" /><TextView android:id="@+id/iv_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/iv_icon"android:singleLine="true"android:ellipsize="end"android:textColor="#000000"android:textSize="20sp"android:text="毕业生拒绝年薪300万工作 选择年薪200万的华为"/><TextView android:id="@+id/iv_messgae"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:layout_toRightOf="@+id/iv_icon"android:layout_below="@+id/iv_title"android:textColor="#999999"android:textSize="15sp"android:text="今天,刚毕业就年薪200万”的话题冲上热搜!他是谁?"/></RelativeLayout>

MainActivity.java

package com.example.listviewLX;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]找到关心的控件ListView lv=(ListView) findViewById(R.id.lv);//[2]设置适配器布局lv.setAdapter(new MyAdapter());}public class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return 1000;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//[1]想办法将自定义的布局转换为一个viewView view;if(convertView==null){/*** View.inflate(context, resource, root)* * 创建新的view对象 通过打气筒inflate将一个xml布局转换为一个view* resource就是xml文件 通过R.layout找到* root:ViewGroup类型 LinearLayout,reaLayout都继承自ViewGroup,这种类型可以有自己的孩子*      root即用来指定默认的父亲  此处只为了转换为view,故用不到*/view = View.inflate(getApplicationContext(), R.layout.item, null);}else{//复用历史缓存对象view=convertView;}return view;}}
}

获取打气筒各种方法

3种方法,第一种最简单,第三种最常用

// 获取打气筒方法一
view = View.inflate(getApplicationContext(), R.layout.item,null);// 获取打气筒方法二
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);//获取打气筒方法三
LayoutInflater layoutInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item, null);

MainActivity.java

package com.example.listviewLX;import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]找到关心的控件ListView lv = (ListView) findViewById(R.id.lv);// [2]设置适配器布局lv.setAdapter(new MyAdapter());}public class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return 1000;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// [1]想办法将自定义的布局转换为一个viewView view;if (convertView == null) {/*** View.inflate(context, resource, root)* * 创建新的view对象 通过打气筒inflate将一个xml布局转换为一个view resource就是xml文件* 通过R.layout找到 root:ViewGroup类型* LinearLayout,reaLayout都继承自ViewGroup,这种类型可以有自己的孩子* root即用来指定默认的父亲 此处只为了转换为view,故用不到*/// 获取打气筒方法一// view = View.inflate(getApplicationContext(), R.layout.item,null);// 获取打气筒方法二//view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);//获取打气筒方法三LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);view = layoutInflater.inflate(R.layout.item, null);} else {// 复用历史缓存对象view = convertView;}return view;}}
}

每项显示单一数据(textview)的listview适配器 arrayAdapter

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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=".MainActivity" ><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" />

item2.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:orientation="vertical" ><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /></LinearLayout>

MainActivity.java

package com.example.arrayadapter;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends Activity {String objects[]={"天河","紫英","梦璃","菱纱","天青","玄霄","夙玉"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]找到关心的控件ListView lv = (ListView) findViewById(R.id.lv);//显式单一文本信息时不必要用basedaptor 用arrayadptor即可//[2]创建一个arrayAdapter   (注意此处的adapter的作用都只是专门显式item到listview上)//方法1:注意自定义的R.layout.item只能是个textview  外面不能包什么布局//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item, objects);//方法2:自定义的R.layout.item2里可以有布局包裹了,但是一定要给定义的textview定义id 需要特别指定ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item2, R.id.tv2, objects);//[3]设置数据适配器lv.setAdapter(adapter);}
}

Android备考01 黑马76期-day03 操作数据库相关推荐

  1. 黑马76期培训视频分享

    黑马76期培训视频: 链接:http://pan.baidu.com/s/1pKMN2rh   密码:irh3

  2. Android 第十二课 使用LitePal操作数据库(记得阅读最后面的注意事项哦)

    一.LitePal简介 1.(新建项目LitePalTest) 正式接触第一个开源库---LitePal LitePal是一款开源的Android 数据库框架,它采用了对象关系映射(ORM)的模式. ...

  3. Android初学之十七:使用LitePal操作数据库

    一.LitePal简介 LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完 ...

  4. android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?

    每隔几天我都会通过 Android Developers 的油管官方频道,来了解一下最近 Android 发布了哪些有趣的新技术,最近发现官方推出了一个新的系列视频叫做:Now in Android, ...

  5. 黑马52期+28期+32期+46期最新android视频免费下载

    黑马52期+28期+32期+46期最新android视频免费下载,本人花费高价在黑马学员手上购买的,视频全部完整,加QQ2805816571获取下载地址.

  6. 音视频技术开发周刊 76期

    『音视频技术开发周刊』由LiveVideoStack团队出品,专注在音视频技术领域,纵览相关技术领域的干货和新闻投稿,每周一期.点击『阅读原文』,浏览第76期内容,祝您阅读愉快. 架构 基于WebRT ...

  7. 黑马android74期全套不加密,黑马74期不加密1 05_day41-day43 JNI day01 资料 Android-JNI

    <黑马74期不加密1 05_day41-day43 JNI day01 资料 Android-JNI>由会员分享,可在线阅读,更多相关<黑马74期不加密1 05_day41-day4 ...

  8. android handler 主线程吗,[android开发]非主线程进行handler操作

    [android开发]非主线程进行handler操作 (2012-10-30 16:26:01) 标签: 杂谈 android默认对主线程创建有消息队列及looper(looper是对消息队列的操作类 ...

  9. android开发实现选择列表,Android使用RecyclerView实现列表数据选择操作

    Android使用RecyclerView实现列表数据选择操作 发布时间:2020-08-31 17:50:13 来源:脚本之家 阅读:76 作者:迟做总比不做强 这些时间做安卓盒子项目,因为安卓电视 ...

最新文章

  1. 飞桨领航团 x Datawhale联合Meetup来了!杭州的小伙伴可以见面了!
  2. 关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox
  3. displaynone符合html5标准,javascript – JS HTML5验证“display:none”必需的输入元素
  4. promise间隔时间添加dom
  5. vb ftp linux,VB FTP上传和下载模块
  6. 【写作技巧】毕业设计的附录放在论文的哪个位置?
  7. ParallelActivity
  8. 编写可维护的javascript代码---开篇(介绍自动报错的插件)
  9. c++如何生成指定范围的随机数
  10. 从Unity导出Obj格式的地形(Terrian)
  11. python中jieba库的作用_Python jieba库用法及实例解析
  12. win7删除桌面计算机图标怎么删除,Windows7电脑桌面ie图标怎么删除不了?
  13. oracle sparc 服务器系统,oracle sparc服务器基础及管理.pdf
  14. 查看Oracle数据库实例启动状态
  15. CSDN上面好多千篇一律的抄袭的错误的垃圾文章
  16. MDX基本概念和语法
  17. 软工网络15结对编程练习
  18. python入门可以接私活_第一次接私活亲身经历
  19. 从经典歌曲Scarborough Fair(斯卡布罗集市)看翻译的境界
  20. Epic Games Launcher的安装、解决打开失败问题、插件下载问题

热门文章

  1. 运维(21) 制作WinPE启动U盘
  2. 羊抗HBsAg偶联CdSe/ZnSe/ZnS量子点|抗乙肝表面抗原抗体偶联CdSe/ZnSe/ZnS量子点|羧基量子点偶联anti-HBsAg多克隆抗体
  3. 500kV某变电站红外测温 检测技术方案
  4. 计算机教师访谈报告,计算机老师述职报告
  5. 飞机行李托运java代码_CSS3 飞机行李托运单(含条形码)
  6. 查看 android 设备号,获取Android设备的唯一识别码|设备号|序号|UUID
  7. SSH密钥登录系统报错Permissions 0644 for ‘xxx‘ re too open
  8. 方便的U盘量产工具不刻盘装系统
  9. php 虚拟机速度慢,[译]PHP虚拟机(PHP Virtual Machine)
  10. 值得反复体会的几部电影